65 #include <arpa/inet.h> 70 #include <gnutls/gnutls.h> 73 #include <netinet/in.h> 74 #include <openvas/misc/openvas_logging.h> 75 #include <openvas/base/openvas_file.h> 76 #include <openvas/base/openvas_networking.h> 77 #include <openvas/base/pidfile.h> 78 #include <openvas/omp/xml.h> 79 #include <openvas/misc/openvas_uuid.h> 89 #include <sys/prctl.h> 91 #include <sys/socket.h> 94 #include <sys/types.h> 97 #include <microhttpd.h> 104 #ifdef GIT_REV_AVAILABLE 105 #include "gitrevision.h" 112 #define G_LOG_DOMAIN "gsad main" 114 #undef G_LOG_FATAL_MASK 115 #define G_LOG_FATAL_MASK G_LOG_LEVEL_ERROR 121 #ifndef MHD_HTTP_NOT_ACCEPTABLE 122 #define MHD_HTTP_NOT_ACCEPTABLE MHD_HTTP_METHOD_NOT_ACCEPTABLE 128 #define SID_COOKIE_NAME "GSAD_SID" 133 #define DEFAULT_GSAD_HTTPS_PORT 443 138 #define DEFAULT_GSAD_HTTP_PORT 80 143 #define DEFAULT_GSAD_PORT 9392 148 #define DEFAULT_GSAD_REDIRECT_PORT 80 153 #define DEFAULT_OPENVAS_MANAGER_PORT 9390 158 #define POST_BUFFER_SIZE 500000 163 #define MAX_FILE_NAME_SIZE 128 168 #define SESSION_TIMEOUT 15 173 #define DEFAULT_CLIENT_WATCH_INTERVAL 1 178 #define DEFAULT_GSAD_FACE "classic" 183 #define DEFAULT_GSAD_X_FRAME_OPTIONS "SAMEORIGIN" 188 #define DEFAULT_GSAD_CONTENT_SECURITY_POLICY \ 189 "default-src 'self' 'unsafe-inline';" \ 190 " img-src 'self' blob:;" \ 191 " frame-ancestors 'self'" 196 #define DEFAULT_GSAD_GUEST_CHART_X_FRAME_OPTIONS "SAMEORIGIN" 201 #define DEFAULT_GSAD_GUEST_CHART_CONTENT_SECURITY_POLICY \ 202 "default-src 'self' 'unsafe-inline';" \ 203 " img-src 'self' blob:;" \ 209 #define DEFAULT_GSAD_HSTS_MAX_AGE 31536000 219 #if GCRYPT_VERSION_NUMBER < 0x010600 233 =
"The requested page or file does not exist.";
238 const char *
ERROR_PAGE =
"<html><body>HTTP Method not supported</body></html>";
244 "<html><body>Bad request.</body></html>";
250 "<html><body>An internal server error has occurred.</body></html>";
255 #define UTF8_ERROR_PAGE(location) \ 257 "<head><title>Invalid request</title></head>" \ 258 "<body>The request contained invalid UTF-8 in " location ".</body>" \ 264 #define HOST_HEADER_ERROR_PAGE \ 266 "<head><title>Invalid request</title></head>" \ 267 "<body>The request contained an unknown or invalid Host header." \ 268 " If you are trying to access GSA via its hostname or a proxy," \ 269 " make sure GSA is set up to allow it." \ 389 MHD_add_response_header (response,
"X-Frame-Options",
392 MHD_add_response_header (response,
"Content-Security-Policy",
395 MHD_add_response_header (response,
"Strict-Transport-Security",
406 MHD_add_response_header (response,
"X-Frame-Options",
409 MHD_add_response_header (response,
"Content-Security-Policy",
445 static GMutex *mutex = NULL;
476 g_mutex_lock (mutex);
477 for (index = 0; index <
users->len; index++)
484 g_ptr_array_remove (
users, (gpointer) item);
500 NULL, g_free, g_free);
501 g_ptr_array_add (
users, (gpointer)
user);
514 #define USER_BAD_TOKEN 1 515 #define USER_EXPIRED_TOKEN 2 516 #define USER_BAD_MISSING_COOKIE 3 517 #define USER_BAD_MISSING_TOKEN 4 518 #define USER_GUEST_LOGIN_FAILED 5 519 #define USER_OMP_DOWN 6 520 #define USER_IP_ADDRESS_MISSMATCH 7 521 #define USER_GUEST_LOGIN_ERROR -1 560 g_mutex_lock (mutex);
561 for (index = 0; index <
users->len; index++)
577 g_mutex_unlock (mutex);
616 g_mutex_lock (mutex);
618 for (index = 0; index <
users->len; index++)
657 g_mutex_unlock (mutex);
674 g_mutex_lock (mutex);
675 for (index = 0; index <
users->len; index++)
687 g_mutex_unlock (mutex);
704 g_mutex_lock (mutex);
705 for (index = 0; index <
users->len; index++)
719 g_mutex_unlock (mutex);
736 g_mutex_lock (mutex);
737 for (index = 0; index <
users->len; index++)
749 g_mutex_unlock (mutex);
766 g_mutex_lock (mutex);
767 for (index = 0; index <
users->len; index++)
779 g_mutex_unlock (mutex);
796 g_mutex_lock (mutex);
797 for (index = 0; index <
users->len; index++)
808 g_mutex_unlock (mutex);
826 g_mutex_lock (mutex);
827 for (index = 0; index <
users->len; index++)
834 pref_id, pref_value);
839 g_mutex_unlock (mutex);
856 g_mutex_lock (mutex);
857 for (index = 0; index <
users->len; index++)
869 g_mutex_unlock (mutex);
885 g_mutex_lock (mutex);
886 for (index = 0; index <
users->len; index++)
893 g_debug (
"%s: logging out user '%s', token '%s'",
895 g_ptr_array_remove (
users, (gpointer) item);
899 g_mutex_unlock (mutex);
912 g_mutex_unlock (mutex);
923 g_ptr_array_remove (
users, (gpointer)
user);
924 g_mutex_unlock (mutex);
943 g_mutex_lock (mutex);
944 for (index = 0; index <
users->len; index++)
968 g_mutex_unlock (mutex);
985 g_ptr_array_remove (
users, (gpointer)
user);
986 g_mutex_unlock (mutex);
1010 "|(create_container_task)" 1011 "|(create_credential)" 1017 "|(create_override)" 1018 "|(create_permission)" 1019 "|(create_permissions)" 1020 "|(create_port_list)" 1021 "|(create_port_range)" 1025 "|(create_schedule)" 1029 "|(cvss_calculator)" 1035 "|(delete_credential)" 1040 "|(delete_override)" 1041 "|(delete_permission)" 1042 "|(delete_port_list)" 1043 "|(delete_port_range)" 1045 "|(delete_report_format)" 1048 "|(delete_schedule)" 1052 "|(delete_trash_agent)" 1053 "|(delete_trash_config)" 1054 "|(delete_trash_alert)" 1055 "|(delete_trash_credential)" 1056 "|(delete_trash_filter)" 1057 "|(delete_trash_group)" 1058 "|(delete_trash_note)" 1059 "|(delete_trash_override)" 1060 "|(delete_trash_permission)" 1061 "|(delete_trash_port_list)" 1062 "|(delete_trash_report_format)" 1063 "|(delete_trash_role)" 1064 "|(delete_trash_scanner)" 1065 "|(delete_trash_schedule)" 1066 "|(delete_trash_tag)" 1067 "|(delete_trash_target)" 1068 "|(delete_trash_task)" 1070 "|(delete_user_confirm)" 1072 "|(download_credential)" 1073 "|(download_ssl_cert)" 1074 "|(download_ca_pub)" 1075 "|(download_key_pub)" 1080 "|(edit_config_family)" 1081 "|(edit_config_nvt)" 1082 "|(edit_credential)" 1085 "|(edit_my_settings)" 1088 "|(edit_permission)" 1090 "|(edit_report_format)" 1109 "|(export_credential)" 1110 "|(export_credentials)" 1118 "|(export_override)" 1119 "|(export_overrides)" 1120 "|(export_permission)" 1121 "|(export_permissions)" 1122 "|(export_port_list)" 1123 "|(export_port_lists)" 1124 "|(export_preference_file)" 1125 "|(export_report_format)" 1126 "|(export_report_formats)" 1132 "|(export_scanners)" 1133 "|(export_schedule)" 1134 "|(export_schedules)" 1148 "|(get_assets_chart)" 1150 "|(get_config_family)" 1155 "|(get_credentials)" 1163 "|(get_my_settings)" 1170 "|(get_permissions)" 1173 "|(get_protocol_doc)" 1176 "|(get_report_format)" 1177 "|(get_report_formats)" 1178 "|(get_report_section)" 1187 "|(get_system_reports)" 1194 "|(get_tasks_chart)" 1199 "|(import_port_list)" 1201 "|(import_report_format)" 1207 "|(new_container_task)" 1215 "|(new_permissions)" 1218 "|(new_report_format)" 1235 "|(save_chart_preference)" 1237 "|(save_config_family)" 1238 "|(save_config_nvt)" 1239 "|(save_container_task)" 1240 "|(save_credential)" 1243 "|(save_my_settings)" 1246 "|(save_permission)" 1248 "|(save_report_format)" 1264 "|(upload_port_list)" 1267 "|(verify_report_format)" 1278 openvas_validator_add (
validator,
"aggregate_type",
"^(agent|alert|config|credential|filter|group|host|nvt|note|os|override|permission|port_list|report|report_format|result|role|scanner|schedule|tag|target|task|user|allinfo|cve|cpe|ovaldef|cert_bund_adv|dfn_cert_adv)$");
1279 openvas_validator_add (
validator,
"alive_tests",
"^(Scan Config Default|ICMP Ping|TCP-ACK Service Ping|TCP-SYN Service Ping|ARP Ping|ICMP & TCP-ACK Service Ping|ICMP & ARP Ping|TCP-ACK Service & ARP Ping|ICMP, TCP-ACK Service & ARP Ping|Consider Alive)$");
1378 "^(Browser Language|" 1379 "([a-z]{2,3})(_[A-Z]{2})?(@[[:alnum:]_-]+)?" 1380 "(:([a-z]{2,3})(_[A-Z]{2})?(@[[:alnum:]_-]+)?)*)$");
1433 "^(summary|results|hosts|ports" 1434 "|closed_cves|vulns|os|apps|errors" 1435 "|topology|ssl_certs|cves)$");
1443 "^(agent|alert|asset|config|credential|filter|group|host|nvt|note|os|override|permission|port_list|report|report_format|result|role|scanner|schedule|tag|target|task|user|info|cve|cpe|ovaldef|cert_bund_adv|dfn_cert_adv|" 1444 "Agent|Alert|Asset|Config|Credential|Filter|Group|Host|Note|NVT|Operating System|Override|Permission|Port List|Report|Report Format|Result|Role|Scanner|Schedule|Tag|Target|Task|User|SecInfo|CVE|CPE|OVAL Definition|CERT-Bund Advisory|DFN-CERT Advisory)$");
1447 "^(agent|alert|asset|config|credential|filter|group|host|note|nvt|os|override|permission|port_list|report|report_format|result|role|scanner|schedule|tag|target|task|user|info|" 1448 "Agent|Alert|Asset|Config|Credential|Filter|Group|Host|Note|NVT|Operating System|Override|Permission|Port List|Report|Report Format|Result|Role|Scanner|Schedule|Tag|Target|Task|User|SecInfo|)$");
1695 else if (strcmp (format,
"deb") == 0)
1697 else if (strcmp (format,
"exe") == 0)
1699 else if (strcmp (format,
"html") == 0)
1701 else if (strcmp (format,
"key") == 0)
1703 else if (strcmp (format,
"nbe") == 0)
1705 else if (strcmp (format,
"pdf") == 0)
1707 else if (strcmp (format,
"rpm") == 0)
1709 else if (strcmp (format,
"xml") == 0)
1725 struct gsad_connection_info
1727 struct MHD_PostProcessor *postprocessor;
1735 char *content_disposition;
1736 size_t content_length;
1740 #ifdef SERVE_STATIC_ASSETS 1752 file_reader (
void *cls, uint64_t pos,
char *buf,
int max)
1756 fseek (file, pos, SEEK_SET);
1757 return fread (buf, 1, max, file);
1772 free_resources (
void *cls,
struct MHD_Connection *connection,
1773 void **con_cls,
enum MHD_RequestTerminationCode toe)
1775 struct gsad_connection_info *con_info =
1776 (
struct gsad_connection_info *) *con_cls;
1778 if (NULL == con_info)
1780 g_debug (
"con_info was NULL!\n");
1784 g_debug (
"connectiontype=%d\n", con_info->connectiontype);
1786 if (con_info->connectiontype == 1)
1788 if (NULL != con_info->postprocessor)
1790 MHD_destroy_post_processor (con_info->postprocessor);
1795 g_free (con_info->cookie);
1796 g_free (con_info->content_disposition);
1797 g_free (con_info->language);
1815 params_append_mhd (
params_t *params,
1817 const char *filename,
1818 const char *chunk_data,
1822 if ((strncmp (name,
"bulk_selected:", strlen (
"bulk_selected:")) == 0)
1823 || (strncmp (name,
"chart_gen:", strlen (
"chart_gen:")) == 0)
1824 || (strncmp (name,
"chart_init:", strlen (
"chart_init:")) == 0)
1825 || (strncmp (name,
"condition_data:", strlen (
"condition_data:")) == 0)
1826 || (strncmp (name,
"data_columns:", strlen (
"data_columns:")) == 0)
1827 || (strncmp (name,
"event_data:", strlen (
"event_data:")) == 0)
1828 || (strncmp (name,
"settings_changed:", strlen (
"settings_changed:"))
1830 || (strncmp (name,
"settings_default:", strlen (
"settings_default:"))
1832 || (strncmp (name,
"settings_filter:", strlen (
"settings_filter:")) == 0)
1833 || (strncmp (name,
"file:", strlen (
"file:")) == 0)
1834 || (strncmp (name,
"include_id_list:", strlen (
"include_id_list:")) == 0)
1835 || (strncmp (name,
"parameter:", strlen (
"parameter:")) == 0)
1836 || (strncmp (name,
"password:", strlen (
"password:")) == 0)
1837 || (strncmp (name,
"preference:", strlen (
"preference:")) == 0)
1838 || (strncmp (name,
"select:", strlen (
"select:")) == 0)
1839 || (strncmp (name,
"text_columns:", strlen (
"text_columns:")) == 0)
1840 || (strncmp (name,
"trend:", strlen (
"trend:")) == 0)
1841 || (strncmp (name,
"method_data:", strlen (
"method_data:")) == 0)
1842 || (strncmp (name,
"nvt:", strlen (
"nvt:")) == 0)
1843 || (strncmp (name,
"alert_id_optional:", strlen (
"alert_id_optional:"))
1845 || (strncmp (name,
"group_id_optional:", strlen (
"group_id_optional:"))
1847 || (strncmp (name,
"role_id_optional:", strlen (
"role_id_optional:"))
1849 || (strncmp (name,
"related:", strlen (
"related:")) == 0)
1850 || (strncmp (name,
"sort_fields:", strlen (
"sort_fields:")) == 0)
1851 || (strncmp (name,
"sort_orders:", strlen (
"sort_orders:")) == 0)
1852 || (strncmp (name,
"sort_stats:", strlen (
"sort_stats:")) == 0)
1853 || (strncmp (name,
"y_fields:", strlen (
"y_fields:")) == 0)
1854 || (strncmp (name,
"z_fields:", strlen (
"z_fields:")) == 0))
1860 colon = strchr (name,
':');
1864 if ((colon - name) == (strlen (name) - 1))
1875 prefix = g_strndup (name, 1 + colon - name);
1904 if ((strcmp (name,
"alert_ids:") == 0)
1905 || (strcmp(name,
"role_ids:") == 0)
1906 || (strcmp(name,
"group_ids:") == 0)
1907 || (strcmp(name,
"id_list:") == 0))
1922 if (chunk_offset == 0)
1968 serve_post (
void *coninfo_cls,
enum MHD_ValueKind kind,
const char *key,
1970 const char *transfer_encoding,
const char *data, uint64_t off,
1973 struct gsad_connection_info *con_info =
1974 (
struct gsad_connection_info *) coninfo_cls;
1976 con_info->answercode = MHD_HTTP_INTERNAL_SERVER_ERROR;
1981 params_append_mhd (con_info->params, key, filename, data, size, off);
1982 con_info->answercode = MHD_HTTP_OK;
1995 params_mhd_validate_values (
const char *parent_name,
void *params)
1999 gchar *name, *name_name, *value_name;
2001 name_name = g_strdup_printf (
"%sname", parent_name);
2002 value_name = g_strdup_printf (
"%svalue", parent_name);
2010 if ((g_utf8_validate (name, -1, NULL) == FALSE)
2011 || (g_utf8_validate (
param->
value, -1, NULL) == FALSE))
2021 (item_name = g_strdup_printf (
"%s%s:",
2049 const gchar *alias_for;
2055 if ((
param->
value && (strcmp ((gchar*) name,
"number") == 0))
2056 || (alias_for && (strcmp ((gchar*) alias_for,
"number") == 0)))
2076 g_free (value_name);
2085 params_mhd_validate (
void *params)
2087 GHashTableIter iter;
2088 gpointer name, value;
2090 g_hash_table_iter_init (&iter, params);
2091 while (g_hash_table_iter_next (&iter, &name, &value))
2098 || g_utf8_validate (
param->
value, -1, NULL)));
2100 if ((!g_str_has_prefix (name,
"osp_pref_")
2109 const gchar *alias_for;
2114 if ((
param->
value && (strcmp ((gchar*) name,
"number") == 0))
2115 || (alias_for && (strcmp ((gchar*) alias_for,
"number") == 0)))
2128 #define ELSE(name) \ 2129 else if (!strcmp (cmd, G_STRINGIFY (name))) \ 2130 con_info->response = name ## _omp (&connection, credentials, \ 2131 con_info->params, &response_data); 2134 credentials_new (
user_t *
user,
const char *language,
const char *client_address)
2156 credentials->
language = g_strdup (language);
2174 g_free (creds->
role);
2176 g_free (creds->
token);
2205 exec_omp_post (
struct gsad_connection_info *con_info,
user_t **user_return,
2206 gchar **new_sid,
const char *client_address)
2211 const char *cmd, *caller, *language;
2214 const char *xml_flag;
2216 openvas_connection_t connection;
2220 params_mhd_validate (con_info->params);
2224 if (cmd && !strcmp (cmd,
"login"))
2226 const char *password;
2228 password =
params_value (con_info->params,
"password");
2229 if ((password == NULL)
2237 gchar *timezone, *role, *capabilities, *severity, *language;
2238 gchar *pw_warning, *autorefresh;
2255 char ctime_now[200];
2257 if (ret == -1 || ret == 2)
2268 " Waiting for OMP service to become available." 2271 " Error during authentication." 2277 ? con_info->language
2281 if (xml_flag && strcmp (xml_flag,
"0"))
2288 con_info->response = res;
2291 g_warning (
"Authentication failure for '%s' from %s",
2299 password, timezone, severity, role, capabilities,
2300 language, pw_warning, chart_prefs, autorefresh,
2303 g_message (
"Authentication success for '%s' from %s",
2308 *user_return =
user;
2311 g_free (capabilities);
2314 g_free (pw_warning);
2315 g_free (autorefresh);
2325 char ctime_now[200];
2332 xml =
login_xml (
"Login failed.", NULL, ctime_now, NULL,
2333 con_info->language ? con_info->language
2336 if (xml_flag && strcmp (xml_flag,
"0"))
2343 con_info->response = res;
2345 g_warning (
"Authentication failure for '%s' from %s",
2361 "Internal error", __FUNCTION__, __LINE__,
2362 "An internal error occurred inside GSA daemon. " 2363 "Diagnostics: Token missing.",
2364 "/omp?cmd=get_tasks", &response_data);
2368 "Internal error", __FUNCTION__, __LINE__,
2369 "An internal error occurred inside GSA daemon. " 2370 "Diagnostics: Token bad.",
2371 "/omp?cmd=get_tasks", &response_data);
2378 client_address, &
user);
2384 "Internal error", __FUNCTION__, __LINE__,
2385 "An internal error occurred inside GSA daemon. " 2386 "Diagnostics: Bad token.",
2387 "/omp?cmd=get_tasks", &response_data);
2397 char ctime_now[200];
2404 if (caller && g_utf8_validate (caller, -1, NULL) == FALSE)
2407 g_warning (
"%s - caller is not valid UTF-8", __FUNCTION__);
2412 xml =
login_xml (
"Session has expired. Please login again.",
2419 ? con_info->language
2423 if (xml_flag && strcmp (xml_flag,
"0"))
2424 con_info->response = xml;
2439 char ctime_now[200];
2444 xml =
login_xml (
"Cookie missing or bad. Please login again.",
2449 ? con_info->language
2453 if (xml_flag && strcmp (xml_flag,
"0"))
2454 con_info->response = xml;
2470 char ctime_now[200];
2477 ?
"Login failed. OMP service is down." 2479 ?
"Login failed. Error during authentication." 2485 ? con_info->language
2488 if (xml_flag && strcmp (xml_flag,
"0"))
2489 con_info->response = xml;
2507 credentials = credentials_new (
user, language, client_address);
2508 credentials->
params = con_info->params;
2509 gettimeofday (&credentials->
cmd_start, NULL);
2514 if (caller && g_utf8_validate (caller, -1, NULL) == FALSE)
2516 g_warning (
"%s - caller is not valid UTF-8", __FUNCTION__);
2519 credentials->
caller = g_strdup (caller ?:
"");
2521 if (new_sid) *new_sid = g_strdup (
user->
cookie);
2529 if (setenv (
"TZ", credentials->
timezone, 1) == -1)
2531 g_critical (
"%s: failed to set TZ\n", __FUNCTION__);
2532 exit (EXIT_FAILURE);
2543 con_info->answercode = MHD_HTTP_SERVICE_UNAVAILABLE;
2544 con_info->response =
logout (credentials,
2545 "Logged out. OMP service is down.",
2550 con_info->answercode = MHD_HTTP_INTERNAL_SERVER_ERROR;
2553 "Internal error", __FUNCTION__, __LINE__,
2554 "An internal error occurred. " 2555 "Diagnostics: Could not authenticate to manager " 2557 "/omp?cmd=get_tasks",
2561 con_info->answercode = MHD_HTTP_INTERNAL_SERVER_ERROR;
2564 "Internal error", __FUNCTION__, __LINE__,
2565 "An internal error occurred. " 2566 "Diagnostics: Failure to connect to manager " 2568 "/omp?cmd=get_tasks",
2583 "An internal error occurred inside GSA daemon. " 2584 "Diagnostics: Empty command.",
2585 "/omp?cmd=get_tasks", &response_data);
2592 ELSE (create_container_task)
2593 ELSE (create_credential)
2594 ELSE (create_filter)
2597 ELSE (create_permission)
2598 ELSE (create_permissions)
2599 ELSE (create_port_list)
2600 ELSE (create_port_range)
2601 ELSE (create_report)
2605 ELSE (create_scanner)
2606 ELSE (create_schedule)
2608 ELSE (create_target)
2609 ELSE (create_config)
2611 ELSE (create_override)
2616 ELSE (delete_credential)
2617 ELSE (delete_filter)
2620 ELSE (delete_override)
2621 ELSE (delete_permission)
2622 ELSE (delete_port_list)
2623 ELSE (delete_port_range)
2624 ELSE (delete_report)
2625 ELSE (delete_report_format)
2627 ELSE (delete_scanner)
2628 ELSE (delete_schedule)
2631 ELSE (delete_target)
2632 ELSE (delete_trash_agent)
2633 ELSE (delete_trash_config)
2634 ELSE (delete_trash_alert)
2635 ELSE (delete_trash_credential)
2636 ELSE (delete_trash_filter)
2637 ELSE (delete_trash_group)
2638 ELSE (delete_trash_note)
2639 ELSE (delete_trash_override)
2640 ELSE (delete_trash_permission)
2641 ELSE (delete_trash_port_list)
2642 ELSE (delete_trash_report_format)
2643 ELSE (delete_trash_role)
2644 ELSE (delete_trash_scanner)
2645 ELSE (delete_trash_schedule)
2646 ELSE (delete_trash_tag)
2647 ELSE (delete_trash_target)
2648 ELSE (delete_trash_task)
2649 ELSE (delete_config)
2650 ELSE (empty_trashcan)
2651 else if (!strcmp (cmd,
"alert_report"))
2654 (&connection, credentials, con_info->params,
2657 ELSE (import_config)
2658 ELSE (import_port_list)
2659 ELSE (import_report)
2660 ELSE (import_report_format)
2661 else if (!strcmp (cmd,
"process_bulk"))
2666 &con_info->content_type,
2667 &con_info->content_disposition,
2668 &con_info->content_length,
2679 else if (!strcmp (cmd,
"save_chart_preference"))
2681 gchar *pref_id, *pref_value;
2686 &pref_id, &pref_value,
2688 if (pref_id && pref_value)
2692 ELSE (save_config_family)
2693 ELSE (save_config_nvt)
2694 ELSE (save_credential)
2697 else if (!strcmp (cmd,
"save_my_settings"))
2699 char *timezone, *password, *severity, *language;
2701 credentials, con_info->params,
2703 &timezone, &password,
2704 &severity, &language,
2729 ELSE (save_override)
2730 ELSE (save_permission)
2731 ELSE (save_port_list)
2732 ELSE (save_report_format)
2735 ELSE (save_schedule)
2739 ELSE (save_container_task)
2740 else if (!strcmp (cmd,
"save_user"))
2742 char *password, *modified_user;
2744 con_info->response =
save_user_omp (&connection, credentials,
2746 &password, &modified_user, &
logout,
2748 if (modified_user &&
logout)
2765 ELSE (verify_report_format)
2766 ELSE (verify_scanner)
2774 "An internal error occurred inside GSA daemon. " 2775 "Diagnostics: Unknown command.",
2776 "/omp?cmd=get_tasks", &response_data);
2781 con_info->answercode = MHD_HTTP_SEE_OTHER;
2782 con_info->redirect = response_data.
redirect;
2788 credentials_free (credentials);
2789 openvas_connection_close (&connection);
2802 params_mhd_add (
void *params,
enum MHD_ValueKind kind,
const char *name,
2805 if ((strncmp (name,
"bulk_selected:", strlen (
"bulk_selected:")) == 0)
2806 || (strncmp (name,
"chart_gen:", strlen (
"chart_gen:")) == 0)
2807 || (strncmp (name,
"chart_init:", strlen (
"chart_init:")) == 0)
2808 || (strncmp (name,
"condition_data:", strlen (
"condition_data:")) == 0)
2809 || (strncmp (name,
"data_columns:", strlen (
"data_columns:")) == 0)
2810 || (strncmp (name,
"event_data:", strlen (
"event_data:")) == 0)
2811 || (strncmp (name,
"settings_changed:", strlen (
"settings_changed:"))
2813 || (strncmp (name,
"settings_default:", strlen (
"settings_default:"))
2815 || (strncmp (name,
"settings_filter:", strlen (
"settings_filter:")) == 0)
2816 || (strncmp (name,
"file:", strlen (
"file:")) == 0)
2817 || (strncmp (name,
"include_id_list:", strlen (
"include_id_list:")) == 0)
2818 || (strncmp (name,
"parameter:", strlen (
"parameter:")) == 0)
2819 || (strncmp (name,
"password:", strlen (
"password:")) == 0)
2820 || (strncmp (name,
"preference:", strlen (
"preference:")) == 0)
2821 || (strncmp (name,
"select:", strlen (
"select:")) == 0)
2822 || (strncmp (name,
"text_columns:", strlen (
"text_columns:")) == 0)
2823 || (strncmp (name,
"trend:", strlen (
"trend:")) == 0)
2824 || (strncmp (name,
"method_data:", strlen (
"method_data:")) == 0)
2825 || (strncmp (name,
"nvt:", strlen (
"nvt:")) == 0)
2826 || (strncmp (name,
"alert_id_optional:", strlen (
"alert_id_optional:"))
2828 || (strncmp (name,
"group_id_optional:", strlen (
"group_id_optional:"))
2830 || (strncmp (name,
"role_id_optional:", strlen (
"role_id_optional:"))
2832 || (strncmp (name,
"related:", strlen (
"related:")) == 0)
2833 || (strncmp (name,
"sort_fields:", strlen (
"sort_fields:")) == 0)
2834 || (strncmp (name,
"sort_orders:", strlen (
"sort_orders:")) == 0)
2835 || (strncmp (name,
"sort_stats:", strlen (
"sort_stats:")) == 0)
2836 || (strncmp (name,
"y_fields:", strlen (
"y_fields:")) == 0)
2837 || (strncmp (name,
"z_fields:", strlen (
"z_fields:")) == 0))
2845 colon = strchr (name,
':');
2847 if ((colon - name) == (strlen (name) - 1))
2854 prefix = g_strndup (name, 1 + colon - name);
2875 if ((strcmp (name,
"alert_ids:") == 0)
2876 || (strcmp(name,
"role_ids:") == 0)
2877 || (strcmp(name,
"group_ids:") == 0)
2878 || (strcmp(name,
"id_list:") == 0))
2914 int client_socket_fd;
2915 openvas_connection_t *openvas_connection;
2916 int connection_closed;
2917 pthread_mutex_t mutex;
2918 } connection_watcher_data_t;
2929 static connection_watcher_data_t*
2930 connection_watcher_data_new (openvas_connection_t *openvas_connection,
2931 int client_socket_fd)
2933 connection_watcher_data_t *watcher_data;
2934 watcher_data = g_malloc (
sizeof (connection_watcher_data_t));
2936 watcher_data->openvas_connection = openvas_connection;
2937 watcher_data->client_socket_fd = client_socket_fd;
2938 watcher_data->connection_closed = 0;
2939 pthread_mutex_init (&(watcher_data->mutex), NULL);
2941 return watcher_data;
2952 watch_client_connection (
void* data)
2955 connection_watcher_data_t *watcher_data;
2957 pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL);
2958 watcher_data = (connection_watcher_data_t*) data;
2960 pthread_mutex_lock (&(watcher_data->mutex));
2962 pthread_mutex_unlock (&(watcher_data->mutex));
2966 pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL);
2968 pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL);
2970 pthread_mutex_lock (&(watcher_data->mutex));
2972 if (watcher_data->connection_closed)
2975 pthread_mutex_unlock (&(watcher_data->mutex));
2981 ret = recv (watcher_data->client_socket_fd, buf, 1, MSG_PEEK);
2985 if (watcher_data->connection_closed == 0)
2987 watcher_data->connection_closed = 1;
2989 g_debug (
"%s: Client connection closed", __FUNCTION__);
2991 if (watcher_data->openvas_connection->tls)
2993 openvas_connection_t *gvm_conn;
2994 gvm_conn = watcher_data->openvas_connection;
2995 gnutls_bye (gvm_conn->session, GNUTLS_SHUT_RDWR);
2999 openvas_connection_close (watcher_data->openvas_connection);
3004 pthread_mutex_unlock (&(watcher_data->mutex));
3016 #define ELSE(name) \ 3017 else if (!strcmp (cmd, G_STRINGIFY (name))) \ 3018 ret = name ## _omp (&connection, credentials, params, response_data); 3040 exec_omp_get (
struct MHD_Connection *con,
3043 gchar **content_type_string,
3044 char** content_disposition,
3045 gsize* response_size,
3048 openvas_connection_t connection;
3050 const int CMD_MAX_SIZE = 27;
3053 pthread_t watch_thread;
3054 connection_watcher_data_t *watcher_data;
3057 (
char *) MHD_lookup_connection_value (con, MHD_GET_ARGUMENT_KIND,
3067 if ((cmd != NULL) && (strlen (cmd) <= CMD_MAX_SIZE))
3069 g_debug (
"cmd: [%s]\n", cmd);
3073 MHD_get_connection_values (con, MHD_GET_ARGUMENT_KIND,
3074 params_mhd_add, params);
3076 params_mhd_validate (params);
3077 credentials->
params = params;
3083 "Internal error", __FUNCTION__, __LINE__,
3084 "An internal error occurred inside GSA daemon. " 3085 "Diagnostics: No valid command for omp.",
3086 "/omp?cmd=get_tasks", response_data);
3094 if (setenv (
"TZ", credentials->
timezone, 1) == -1)
3096 g_critical (
"%s: failed to set TZ\n", __FUNCTION__);
3097 exit (EXIT_FAILURE);
3108 return logout (credentials,
3109 "Logged out. OMP service is down.",
3113 "Internal error", __FUNCTION__, __LINE__,
3114 "An internal error occurred. " 3115 "Diagnostics: Could not authenticate to manager " 3117 "/omp?cmd=get_tasks",
3121 "Internal error", __FUNCTION__, __LINE__,
3122 "An internal error occurred. " 3123 "Diagnostics: Failure to connect to manager " 3125 "/omp?cmd=get_tasks",
3136 credentials->
charts = atoi (charts);
3140 gettimeofday (&credentials->
cmd_start, NULL);
3144 const union MHD_ConnectionInfo *mhd_con_info;
3146 = MHD_get_connection_info (con,
3147 MHD_CONNECTION_INFO_CONNECTION_FD);
3149 watcher_data = connection_watcher_data_new (&connection,
3150 mhd_con_info->connect_fd);
3152 pthread_create (&watch_thread, NULL,
3153 watch_client_connection, watcher_data);
3157 watcher_data = NULL;
3164 if (!strcmp (cmd,
"cvss_calculator"))
3165 ret =
cvss_calculator (&connection, credentials, params, response_data);
3167 else if (!strcmp (cmd,
"dashboard"))
3168 ret =
dashboard (&connection, credentials, params, response_data);
3170 else if (!strcmp (cmd,
"new_filter"))
3171 ret =
new_filter_omp (&connection, credentials, params, response_data);
3173 ELSE (new_container_task)
3181 ELSE (get_assets_chart)
3184 ELSE (get_tasks_chart)
3185 ELSE (delete_user_confirm)
3190 ELSE (edit_config_family)
3191 ELSE (edit_config_nvt)
3192 ELSE (edit_credential)
3195 ELSE (edit_my_settings)
3199 ELSE (edit_port_list)
3200 ELSE (edit_report_format)
3208 ELSE (auth_settings)
3210 else if (!strcmp (cmd,
"export_agent"))
3212 content_disposition, response_size,
3215 else if (!strcmp (cmd,
"export_agents"))
3217 content_disposition, response_size,
3220 else if (!strcmp (cmd,
"export_alert"))
3222 content_disposition, response_size,
3225 else if (!strcmp (cmd,
"export_alerts"))
3227 content_disposition, response_size,
3230 else if (!strcmp (cmd,
"export_asset"))
3232 content_disposition, response_size,
3235 else if (!strcmp (cmd,
"export_assets"))
3237 content_disposition, response_size,
3240 else if (!strcmp (cmd,
"export_config"))
3242 content_disposition, response_size,
3245 else if (!strcmp (cmd,
"export_configs"))
3247 content_disposition, response_size,
3250 else if (!strcmp (cmd,
"download_credential"))
3253 gchar *credential_login;
3254 const char *credential_id;
3255 const char *package_format;
3257 package_format =
params_value (params,
"package_format");
3258 credential_login = NULL;
3259 credential_id =
params_value (params,
"credential_id");
3271 content_type_from_format_string (
content_type, package_format);
3272 g_free (*content_disposition);
3273 *content_disposition = g_strdup_printf
3274 (
"attachment; filename=credential-%s.%s",
3276 && strcmp (credential_login,
""))
3279 (strcmp (package_format,
"key") == 0
3282 g_free (credential_login);
3287 else if (!strcmp (cmd,
"export_credential"))
3289 content_disposition, response_size,
3292 else if (!strcmp (cmd,
"export_credentials"))
3295 response_size, response_data);
3297 else if (!strcmp (cmd,
"export_filter"))
3299 content_disposition, response_size,
3302 else if (!strcmp (cmd,
"export_filters"))
3304 content_disposition, response_size,
3307 else if (!strcmp (cmd,
"export_group"))
3309 content_disposition, response_size,
3312 else if (!strcmp (cmd,
"export_groups"))
3314 content_disposition, response_size,
3317 else if (!strcmp (cmd,
"export_note"))
3319 content_disposition, response_size,
3322 else if (!strcmp (cmd,
"export_notes"))
3324 content_disposition, response_size,
3327 else if (!strcmp (cmd,
"export_omp_doc"))
3329 content_disposition, response_size,
3332 else if (!strcmp (cmd,
"export_override"))
3334 content_disposition, response_size,
3337 else if (!strcmp (cmd,
"export_overrides"))
3339 content_disposition, response_size,
3342 else if (!strcmp (cmd,
"export_permission"))
3344 content_disposition, response_size,
3347 else if (!strcmp (cmd,
"export_permissions"))
3349 content_disposition, response_size,
3352 else if (!strcmp (cmd,
"export_port_list"))
3354 content_disposition, response_size,
3357 else if (!strcmp (cmd,
"export_port_lists"))
3359 content_disposition, response_size,
3362 else if (!strcmp (cmd,
"export_preference_file"))
3365 response_size, response_data);
3367 else if (!strcmp (cmd,
"export_report_format"))
3370 response_size, response_data);
3372 else if (!strcmp (cmd,
"export_report_formats"))
3375 response_size, response_data);
3377 else if (!strcmp (cmd,
"export_result"))
3379 content_disposition, response_size, response_data);
3381 else if (!strcmp (cmd,
"export_results"))
3383 content_disposition, response_size,
3386 else if (!strcmp (cmd,
"export_role"))
3388 content_disposition, response_size,
3391 else if (!strcmp (cmd,
"export_roles"))
3393 content_disposition, response_size,
3396 else if (!strcmp (cmd,
"export_scanner"))
3398 content_disposition, response_size,
3401 else if (!strcmp (cmd,
"export_scanners"))
3403 content_disposition, response_size,
3406 else if (!strcmp (cmd,
"export_schedule"))
3408 content_disposition, response_size,
3411 else if (!strcmp (cmd,
"export_schedules"))
3413 content_disposition, response_size,
3416 else if (!strcmp (cmd,
"export_tag"))
3418 content_disposition, response_size,
3421 else if (!strcmp (cmd,
"export_tags"))
3423 content_disposition, response_size,
3426 else if (!strcmp (cmd,
"export_target"))
3428 content_disposition, response_size,
3431 else if (!strcmp (cmd,
"export_targets"))
3433 content_disposition, response_size,
3436 else if (!strcmp (cmd,
"export_task"))
3438 content_disposition, response_size,
3441 else if (!strcmp (cmd,
"export_tasks"))
3443 content_disposition, response_size,
3446 else if (!strcmp (cmd,
"export_user"))
3448 content_disposition, response_size,
3451 else if (!strcmp (cmd,
"export_users"))
3453 content_disposition, response_size,
3461 else if (!strcmp (cmd,
"download_agent"))
3463 char *html, *filename;
3474 g_free (*content_disposition);
3475 *content_disposition = g_strdup_printf (
"attachment; filename=%s",
3482 else if (!strcmp (cmd,
"download_ssl_cert"))
3485 g_free (*content_disposition);
3486 *content_disposition = g_strdup_printf
3487 (
"attachment; filename=ssl-cert-%s.pem",
3494 else if (!strcmp (cmd,
"download_ca_pub"))
3497 g_free (*content_disposition);
3498 *content_disposition = g_strdup_printf
3499 (
"attachment; filename=scanner-ca-pub-%s.pem",
3501 ret =
download_ca_pub (&connection, credentials, params, response_size,
3505 else if (!strcmp (cmd,
"download_key_pub"))
3508 g_free (*content_disposition);
3509 *content_disposition = g_strdup_printf
3510 (
"attachment; filename=scanner-key-pub-%s.pem",
3516 ELSE (get_aggregate)
3519 ELSE (get_credential)
3520 ELSE (get_credentials)
3526 ELSE (get_my_settings)
3530 ELSE (get_overrides)
3531 ELSE (get_permission)
3532 ELSE (get_permissions)
3533 ELSE (get_port_list)
3534 ELSE (get_port_lists)
3536 else if (!strcmp (cmd,
"get_report"))
3538 gchar *content_type_omp;
3543 content_disposition,
3546 if (content_type_omp)
3549 *content_type_string = content_type_omp;
3556 ELSE (get_report_format)
3557 ELSE (get_report_formats)
3558 ELSE (get_report_section)
3564 ELSE (get_schedules)
3565 ELSE (get_system_reports)
3576 ELSE (get_config_family)
3577 ELSE (get_config_nvt)
3579 ELSE (get_protocol_doc)
3583 ELSE (new_credential)
3588 ELSE (new_port_list)
3589 ELSE (new_port_range)
3590 ELSE (new_report_format)
3593 ELSE (upload_config)
3594 ELSE (upload_port_list)
3595 ELSE (upload_report)
3604 "Internal error", __FUNCTION__, __LINE__,
3605 "An internal error occurred inside GSA daemon. " 3606 "Diagnostics: Unknown command.",
3607 "/omp?cmd=get_tasks",
3613 pthread_mutex_lock (&(watcher_data->mutex));
3614 if (watcher_data->connection_closed == 0
3615 || watcher_data->openvas_connection->tls)
3617 openvas_connection_close (watcher_data->openvas_connection);
3619 watcher_data->connection_closed = 1;
3620 pthread_mutex_unlock (&(watcher_data->mutex));
3621 pthread_cancel (watch_thread);
3622 pthread_join (watch_thread, NULL);
3623 g_free (watcher_data);
3627 openvas_connection_close (&connection);
3636 #define EXPIRES_LENGTH 100 3647 attach_sid (
struct MHD_Response *response,
const char *sid)
3653 struct tm expire_time_broken;
3654 time_t now, expire_time;
3660 tz = getenv (
"TZ") ? g_strdup (getenv (
"TZ")) : NULL;
3661 if (setenv (
"TZ",
"GMT", 1) == -1)
3663 g_critical (
"%s: failed to set TZ\n", __FUNCTION__);
3665 exit (EXIT_FAILURE);
3669 locale = g_strdup (setlocale (LC_ALL, NULL));
3670 setlocale (LC_ALL,
"C");
3675 expire_time = now + timeout;
3676 if (localtime_r (&expire_time, &expire_time_broken) == NULL)
3679 &expire_time_broken);
3683 setlocale (LC_ALL, locale);
3689 if (setenv (
"TZ", tz, 1) == -1)
3691 g_warning (
"%s: Failed to switch to original TZ", __FUNCTION__);
3693 exit (EXIT_FAILURE);
3706 "=%s; expires=%s; max-age=%d; path=/; %sHTTPonly",
3711 ret = MHD_add_response_header (response,
"Set-Cookie", value);
3724 remove_sid (
struct MHD_Response *response)
3730 struct tm expire_time_broken;
3734 locale = g_strdup (setlocale (LC_ALL, NULL));
3735 setlocale (LC_ALL,
"C");
3737 expire_time = time (NULL);
3738 if (localtime_r (&expire_time, &expire_time_broken) == NULL)
3741 &expire_time_broken);
3745 setlocale (LC_ALL, locale);
3753 value = g_strdup_printf (
SID_COOKIE_NAME "=0; expires=%s; path=/; %sHTTPonly",
3756 ret = MHD_add_response_header (response,
"Set-Cookie", value);
3771 gsad_add_content_type_header (
struct MHD_Response *response,
3780 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3784 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3788 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3789 "application/html");
3792 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3796 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3800 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3804 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3808 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3809 "application/xml; charset=utf-8");
3812 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3816 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3820 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3821 "application/octet-stream");
3824 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3828 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3829 "text/html; charset=utf-8");
3832 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3836 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3837 "text/plain; charset=utf-8");
3842 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
3843 "text/plain; charset=utf-8");
3856 add_local_addresses (GHashTable *hashtable,
int include_ipv6,
3859 struct ifaddrs *ifaddr, *ifa;
3861 char host[NI_MAXHOST];
3870 if (localhost_only == 0 && getifaddrs(&ifaddr) != -1)
3872 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
3874 if (ifa->ifa_addr == NULL)
3877 family = ifa->ifa_addr->sa_family;
3879 if (family == AF_INET || (include_ipv6 && family == AF_INET6))
3881 ret = getnameinfo(ifa->ifa_addr,
3883 ?
sizeof(
struct sockaddr_in)
3884 :
sizeof(
struct sockaddr_in6),
3886 NULL, 0, NI_NUMERICHOST);
3888 g_warning (
"%s: getnameinfo() failed: %s\n",
3889 __FUNCTION__, gai_strerror(ret));
3893 g_hash_table_insert (hashtable, g_strdup (host), NULL);
3896 freeifaddrs(ifaddr);
3908 host_is_gsad (
const char *host)
3924 validate_host_header (
const char *host_header)
3927 int char_index, colon_index, bracket_index;
3930 if (host_header == NULL || strlen (host_header) == 0)
3932 else if (g_utf8_validate (host_header, -1, NULL) == FALSE)
3940 for (char_index = strlen (host_header) - 1;
3944 if (host_header[char_index] ==
']' && bracket_index == -1)
3945 bracket_index = char_index;
3946 if (host_header[char_index] ==
':' && colon_index == -1)
3947 colon_index = char_index;
3950 if (bracket_index != -1 && host_header[0] ==
'[' 3951 && (colon_index == bracket_index + 1 || colon_index < bracket_index))
3958 host = g_strndup (host_header + 1, bracket_index - 1);
3960 else if (colon_index > 0 && bracket_index == -1)
3966 host = g_strndup (host_header, colon_index);
3968 else if (colon_index == -1 && bracket_index == -1)
3974 host = g_strdup (host_header);
3984 g_debug (
"%s: header: '%s' -> host: '%s'", __FUNCTION__, host_header, host);
3986 ret = host_is_gsad (host) ? 0 : 2;
4006 send_response (
struct MHD_Connection *connection,
const char *content,
4007 int status_code,
const gchar *sid,
4009 const char *content_disposition,
4010 size_t content_length)
4012 struct MHD_Response *response;
4013 size_t size = (content_length ? content_length : strlen (content));
4016 response = MHD_create_response_from_buffer (size, (
void *) content,
4017 MHD_RESPMEM_MUST_COPY);
4018 gsad_add_content_type_header (response, &
content_type);
4020 if (content_disposition)
4021 MHD_add_response_header (response,
"Content-Disposition",
4022 content_disposition);
4026 if (strcmp (sid,
"0"))
4028 if (attach_sid (response, sid) == MHD_NO)
4030 MHD_destroy_response (response);
4036 if (remove_sid (response) == MHD_NO)
4038 MHD_destroy_response (response);
4044 ret = MHD_queue_response (connection, status_code, response);
4045 MHD_destroy_response (response);
4059 send_redirect_to_uri (
struct MHD_Connection *connection,
const char *uri,
4063 struct MHD_Response *response;
4070 body = g_strdup_printf (
"<html><body>Code 303 - Redirecting to" 4071 " <a href=\"%s\">%s<a/></body></html>\n",
4073 response = MHD_create_response_from_buffer (strlen (body), body,
4074 MHD_RESPMEM_MUST_FREE);
4078 g_warning (
"%s: failed to create response, dropping request",
4082 ret = MHD_add_response_header (response, MHD_HTTP_HEADER_LOCATION, uri);
4085 MHD_destroy_response (response);
4086 g_warning (
"%s: failed to add location header, dropping request",
4093 if (attach_sid (response,
user->
cookie) == MHD_NO)
4095 MHD_destroy_response (response);
4096 g_warning (
"%s: failed to attach SID, dropping request",
4102 MHD_add_response_header (response, MHD_HTTP_HEADER_EXPIRES,
"-1");
4103 MHD_add_response_header (response, MHD_HTTP_HEADER_CACHE_CONTROL,
"no-cache");
4106 ret = MHD_queue_response (connection, MHD_HTTP_SEE_OTHER, response);
4107 MHD_destroy_response (response);
4116 #define MAX_HOST_LEN 1000 4128 send_redirect_to_urn (
struct MHD_Connection *connection,
const char *urn,
4131 const char *host, *protocol;
4134 host = MHD_lookup_connection_value (connection, MHD_HEADER_KIND,
4135 MHD_HTTP_HEADER_HOST);
4137 switch (validate_host_header (host))
4144 send_response (connection,
4146 MHD_HTTP_BAD_REQUEST, NULL,
4152 send_response (connection,
4154 MHD_HTTP_BAD_REQUEST, NULL,
4159 protocol = MHD_lookup_connection_value (connection, MHD_HEADER_KIND,
4160 "X-Forwarded-Protocol");
4161 if (protocol && g_utf8_validate (protocol, -1, NULL) == FALSE)
4163 send_response (connection,
4165 MHD_HTTP_BAD_REQUEST, NULL,
4169 else if ((protocol == NULL)
4170 || (strcmp(protocol,
"http") && strcmp(protocol,
"https")))
4178 snprintf (uri,
sizeof (uri),
"%s://%s%s", protocol, host, urn);
4179 return send_redirect_to_uri (connection, uri,
user);
4201 redirect_handler (
void *cls,
struct MHD_Connection *connection,
4202 const char *url,
const char *method,
4203 const char *version,
const char *upload_data,
4204 size_t *upload_data_size,
void **con_cls)
4211 if ((!strcmp (method,
"GET")) && *con_cls == NULL)
4213 struct gsad_connection_info *con_info;
4216 con_info = g_malloc0 (
sizeof (
struct gsad_connection_info));
4218 con_info->connectiontype = 2;
4220 *con_cls = (
void *) con_info;
4225 if (&url[0] == NULL)
4229 if (strcmp (method,
"GET") && strcmp (method,
"POST"))
4237 host = MHD_lookup_connection_value (connection,
4240 switch (validate_host_header (host))
4247 send_response (connection,
4249 MHD_HTTP_BAD_REQUEST, NULL,
4255 send_response (connection,
4257 MHD_HTTP_BAD_REQUEST, NULL,
4262 if (sscanf (host,
"[%" G_STRINGIFY(
MAX_HOST_LEN)
"[0-9a-f:.]]:%*i", name)
4265 char *name6 = g_strdup_printf (
"[%s]", name);
4270 else if (sscanf (host,
"%" G_STRINGIFY(
MAX_HOST_LEN)
"[^:]:%*i", name) == 1)
4274 if (send_redirect_to_uri (connection, location, NULL) == MHD_NO)
4286 #define DATE_2822_LEN 100 4288 #ifdef SERVE_STATIC_ASSETS 4305 static struct MHD_Response*
4307 struct MHD_Connection *connection,
const char* url,
4309 char** content_disposition)
4313 char *default_file =
"login/login.html";
4314 struct MHD_Response* response;
4326 if (strstr (url,
".."))
4327 path = g_strconcat (default_file, NULL);
4331 const char* relative_url = url;
4332 if (*url ==
'/') relative_url = url + 1;
4333 path = g_strconcat (relative_url, NULL);
4336 file = fopen (path,
"r");
4340 g_debug (
"File %s failed, ", path);
4342 struct MHD_Response *response;
4344 *http_response_code = MHD_HTTP_NOT_FOUND;
4349 "/login/login.html", NULL);
4350 response = MHD_create_response_from_buffer (strlen (msg),
4352 MHD_RESPMEM_MUST_COPY);
4358 if (strstr (path,
".png"))
4360 else if (strstr (path,
".svg"))
4362 else if (strstr (path,
".html"))
4364 else if (strstr (path,
".css"))
4366 else if (strstr (path,
".js"))
4368 else if (strstr (path,
".txt"))
4373 g_debug (
"Default file successful.\n");
4374 if (stat (path, &buf))
4377 g_critical (
"%s: file <%s> can not be stat'ed.\n",
4386 if ((buf.st_mode & S_IFMT) != S_IFREG)
4388 struct MHD_Response *ret;
4393 NULL, &response_data);
4398 ret = MHD_create_response_from_buffer (strlen (res), (
void *) res,
4399 MHD_RESPMEM_MUST_FREE);
4403 response = MHD_create_response_from_callback (buf.st_size, 32 * 1024,
4404 (MHD_ContentReaderCallback) &file_reader,
4406 (MHD_ContentReaderFreeCallback)
4409 mtime = localtime (&buf.st_mtime);
4411 && strftime (date_2822,
DATE_2822_LEN,
"%a, %d %b %Y %H:%M:%S %Z", mtime))
4413 MHD_add_response_header (response,
"Last-Modified", date_2822);
4416 next_week = time (NULL) + 7 * 24 * 60 * 60;
4417 mtime = localtime (&next_week);
4419 && strftime (date_2822,
DATE_2822_LEN,
"%a, %d %b %Y %H:%M:%S %Z", mtime))
4421 MHD_add_response_header (response,
"Expires", date_2822);
4444 handler_send_response (
struct MHD_Connection *connection,
4445 struct MHD_Response *response,
4447 char *content_disposition,
4448 int http_response_code,
4454 if (remove_sid (response) == MHD_NO)
4456 MHD_destroy_response (response);
4457 g_warning (
"%s: failed to remove SID, dropping request",
4462 if (content_disposition != NULL)
4464 MHD_add_response_header (response,
"Content-Disposition",
4465 content_disposition);
4466 g_free (content_disposition);
4468 ret = MHD_queue_response (connection, http_response_code, response);
4477 MHD_destroy_response (response);
4492 append_param (
void *
string,
enum MHD_ValueKind kind,
const char *key,
4504 if (strcmp (key,
"token") && strcmp (key,
"r"))
4506 g_string_append ((GString*)
string, key);
4507 g_string_append ((GString*)
string,
"=");
4508 g_string_append ((GString*)
string, value);
4509 g_string_append ((GString*)
string,
"&");
4523 reconstruct_url (
struct MHD_Connection *connection,
const char *url)
4527 full_url = g_string_new (url);
4530 g_string_append (full_url,
"?r=1&");
4532 MHD_get_connection_values (connection, MHD_GET_ARGUMENT_KIND,
4533 append_param, full_url);
4535 if (full_url->str[strlen (full_url->str) - 1] ==
'&')
4536 full_url->str[strlen (full_url->str) - 1] =
'\0';
4538 return g_string_free (full_url, FALSE);
4551 get_client_address (
struct MHD_Connection *conn,
char *client_address)
4553 const char* x_real_ip;
4557 x_real_ip = MHD_lookup_connection_value (conn,
4562 && x_real_ip && g_utf8_validate (x_real_ip, -1, NULL) == FALSE)
4565 strncpy (client_address, x_real_ip, INET6_ADDRSTRLEN);
4567 strncpy (client_address,
"unix_socket", INET6_ADDRSTRLEN);
4570 const union MHD_ConnectionInfo* info;
4572 info = MHD_get_connection_info (conn, MHD_CONNECTION_INFO_CLIENT_ADDRESS);
4573 sockaddr_as_str ((
struct sockaddr_storage *) info->client_addr,
4598 handle_request (
void *cls,
struct MHD_Connection *connection,
4599 const char *url,
const char *method,
4600 const char *version,
const char *upload_data,
4601 size_t * upload_data_size,
void **con_cls)
4603 const char *url_base =
"/";
4604 char *default_file =
"/login/login.html", client_address[INET6_ADDRSTRLEN];
4606 char *content_disposition = NULL;
4607 gsize response_size = 0;
4608 int http_response_code = MHD_HTTP_OK;
4609 const char *xml_flag = NULL;
4611 openvas_connection_t con;
4614 if ((!strcmp (method,
"GET")) && *con_cls == NULL)
4616 struct gsad_connection_info *con_info;
4621 con_info = g_malloc0 (
sizeof (
struct gsad_connection_info));
4623 con_info->connectiontype = 2;
4625 *con_cls = (
void *) con_info;
4630 if (&url[0] == NULL)
4638 if (url && (url[0] ==
'/') && (url[1] ==
'/'))
4643 "/login/login.html", NULL);
4644 send_response (connection, msg, MHD_HTTP_NOT_FOUND,
4651 if (url && (g_utf8_validate (url, -1, NULL) == FALSE))
4653 send_response (connection,
4655 MHD_HTTP_BAD_REQUEST, NULL,
4661 if (strcmp (method,
"GET") && strcmp (method,
"POST"))
4663 send_response (connection,
ERROR_PAGE, MHD_HTTP_METHOD_NOT_ALLOWED,
4675 g_debug (
"============= url: %s\n", reconstruct_url (connection, url));
4677 if (!strcmp (&url[0], url_base))
4679 return send_redirect_to_urn (connection, default_file, NULL);
4682 if ((!strcmp (method,
"GET"))
4683 && (!strncmp (&url[0],
"/login/", strlen (
"/login/")))
4684 && !url[strlen (
"/login/")])
4686 return send_redirect_to_urn (connection, default_file, NULL);
4691 if (!strcmp (method,
"GET"))
4693 const char *token, *cookie, *accept_language, *xml_flag;
4694 const char *omp_cgi_base =
"/omp";
4696 struct MHD_Response *response;
4705 xml_flag = MHD_lookup_connection_value (connection,
4706 MHD_GET_ARGUMENT_KIND,
4715 if (!strcmp (url, default_file))
4720 char ctime_now[200];
4721 const char* accept_language;
4729 accept_language = MHD_lookup_connection_value (connection,
4733 && g_utf8_validate (accept_language, -1, NULL) == FALSE)
4735 send_response (connection,
4737 MHD_HTTP_BAD_REQUEST, NULL,
4749 if (xml_flag && strcmp (xml_flag,
"0"))
4756 response = MHD_create_response_from_buffer (strlen (res), res,
4757 MHD_RESPMEM_MUST_FREE);
4760 return handler_send_response (connection,
4763 content_disposition,
4768 #ifdef SERVE_STATIC_ASSETS 4770 if (!strcmp (url,
"/favicon.ico")
4771 || !strcmp (url,
"/favicon.gif")
4772 || !strcmp (url,
"/robots.txt"))
4774 response = file_content_response (NULL,
4776 &http_response_code,
4778 &content_disposition);
4780 return handler_send_response (connection,
4783 content_disposition,
4790 if (strncmp (url,
"/img/", strlen (
"/img/")) == 0
4791 || strncmp (url,
"/js/", strlen (
"/js/")) == 0
4792 || strncmp (url,
"/css/", strlen (
"/css/")) == 0)
4794 response = file_content_response (NULL,
4796 &http_response_code,
4798 &content_disposition);
4800 return handler_send_response (connection,
4803 content_disposition,
4811 token = MHD_lookup_connection_value (connection,
4812 MHD_GET_ARGUMENT_KIND,
4816 g_debug (
"%s: Missing token in arguments", __FUNCTION__);
4825 cookie = MHD_lookup_connection_value (connection,
4831 get_client_address (connection, client_address);
4832 ret = get_client_address (connection, client_address);
4835 send_response (connection,
4837 MHD_HTTP_BAD_REQUEST, NULL,
4854 "Internal error", __FUNCTION__, __LINE__,
4855 "An internal error occurred inside GSA daemon. " 4856 "Diagnostics: Bad token.",
4857 "/omp?cmd=get_tasks", &response_data);
4863 char ctime_now[200];
4868 accept_language = MHD_lookup_connection_value (connection,
4872 && g_utf8_validate (accept_language, -1, NULL) == FALSE)
4874 send_response (connection,
4876 MHD_HTTP_BAD_REQUEST, NULL,
4882 ?
"Login failed. OMP service is down." 4884 ?
"Login failed. Error during authentication." 4893 if (xml_flag && strcmp (xml_flag,
"0"))
4901 response = MHD_create_response_from_buffer (strlen (res), res,
4902 MHD_RESPMEM_MUST_FREE);
4906 return handler_send_response (connection,
4909 content_disposition,
4922 char ctime_now[200];
4931 cmd = MHD_lookup_connection_value (connection,
4932 MHD_GET_ARGUMENT_KIND,
4936 if (cmd && g_utf8_validate (cmd, -1, NULL))
4938 if (strncmp (cmd,
"export", strlen (
"export")) == 0)
4940 else if (strcmp (cmd,
"get_report") == 0)
4942 const char *report_format_id;
4944 report_format_id = MHD_lookup_connection_value
4946 MHD_GET_ARGUMENT_KIND,
4947 "report_format_id");
4948 if (report_format_id
4949 && g_utf8_validate (report_format_id, -1, NULL))
4954 accept_language = MHD_lookup_connection_value (connection,
4958 && g_utf8_validate (accept_language, -1, NULL) == FALSE)
4960 send_response (connection,
4962 MHD_HTTP_BAD_REQUEST, NULL,
4968 if ((export == 0) && strncmp (url,
"/logout", strlen (
"/logout")))
4970 full_url = reconstruct_url (connection, url);
4971 if (full_url && g_utf8_validate (full_url, -1, NULL) == FALSE)
4982 if (strncmp (url,
"/logout", strlen (
"/logout")))
4992 ? (strncmp (url,
"/logout", strlen (
"/logout"))
4993 ?
"Session has expired. Please login again." 4994 :
"Already logged out.")
4996 ?
"Cookie missing or bad. Please login again." 4997 :
"Token missing or bad. Please login again."),
5000 full_url ? full_url :
"",
5006 if (xml_flag && strcmp (xml_flag,
"0"))
5015 response = MHD_create_response_from_buffer (strlen (res), res,
5016 MHD_RESPMEM_MUST_FREE);
5019 return handler_send_response (connection,
5022 content_disposition,
5032 if (!strncmp (url,
"/logout", strlen (
"/logout")))
5036 char ctime_now[200];
5045 accept_language = MHD_lookup_connection_value (connection,
5049 && g_utf8_validate (accept_language, -1, NULL) == FALSE)
5051 send_response (connection,
5053 MHD_HTTP_BAD_REQUEST, NULL,
5058 xml =
login_xml (
"Successfully logged out.",
5066 if (xml_flag && strcmp (xml_flag,
"0"))
5073 response = MHD_create_response_from_buffer (strlen (res), res,
5074 MHD_RESPMEM_MUST_FREE);
5077 return handler_send_response (connection,
5080 content_disposition,
5089 accept_language = MHD_lookup_connection_value
5090 (connection, MHD_HEADER_KIND,
"Accept-Language");
5092 && g_utf8_validate (accept_language, -1, NULL) == FALSE)
5094 send_response (connection,
5096 MHD_HTTP_BAD_REQUEST, NULL,
5101 credentials = credentials_new (
user, language, client_address);
5105 credentials = credentials_new (
user, language, client_address);
5107 credentials->
caller = reconstruct_url (connection, url);
5109 && g_utf8_validate (credentials->
caller, -1, NULL) == FALSE)
5111 g_free (credentials->
caller);
5112 credentials->
caller = NULL;
5121 if (!strncmp (&url[0], omp_cgi_base, strlen (omp_cgi_base)))
5125 unsigned int res_len = 0;
5126 gchar *content_type_string = NULL;
5131 res = exec_omp_get (connection, credentials, &
content_type,
5132 &content_type_string, &content_disposition,
5133 &response_size, &response_data);
5134 if (response_size > 0)
5136 res_len = response_size;
5141 res_len = strlen (res);
5143 xml_flag = credentials->
params 5146 if (xml_flag && strcmp (xml_flag,
"0"))
5150 response = MHD_create_response_from_buffer (res_len, (
void *) res,
5151 MHD_RESPMEM_MUST_FREE);
5152 if (content_type_string)
5154 MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE,
5155 content_type_string);
5156 g_free (content_type_string);
5161 MHD_add_response_header (response, MHD_HTTP_HEADER_LOCATION,
5163 http_response_code = MHD_HTTP_SEE_OTHER;
5173 else if (!strncmp (&url[0],
"/system_report/",
5174 strlen (
"/system_report/")))
5178 const char *slave_id;
5182 MHD_get_connection_values (connection, MHD_GET_ARGUMENT_KIND,
5183 params_mhd_add, params);
5185 params_mhd_validate (params);
5187 slave_id = MHD_lookup_connection_value (connection,
5188 MHD_GET_ARGUMENT_KIND,
5193 credentials_free (credentials);
5194 g_warning (
"%s: failed to validate slave_id, dropping request",
5208 &url[0] + strlen (
"/system_report/"),
5215 res =
logout (credentials,
5216 "Logged out. OMP service is down.",
5221 "Internal error", __FUNCTION__, __LINE__,
5222 "An internal error occurred. " 5223 "Diagnostics: Could not authenticate to manager " 5225 "/omp?cmd=get_tasks",
5230 "Internal error", __FUNCTION__, __LINE__,
5231 "An internal error occurred. " 5232 "Diagnostics: Failure to connect to manager daemon.",
5233 "/omp?cmd=get_tasks",
5237 openvas_connection_close (&con);
5239 if (response_size > 0)
5241 res_len = response_size;
5245 res_len = strlen (res);
5251 credentials_free (credentials);
5252 g_warning (
"%s: failed to get system reports, dropping request",
5256 response = MHD_create_response_from_buffer ((
unsigned int) res_len,
5257 res, MHD_RESPMEM_MUST_FREE);
5262 else if (!strncmp (&url[0],
"/help/",
5268 if (!g_ascii_isalpha (url[6]))
5272 "Invalid request", __FUNCTION__, __LINE__,
5273 "The requested help page does not exist.",
5274 "/help/contents.html", &response_data);
5278 gchar **preferred_languages;
5279 gchar *xsl_filename = NULL;
5281 GHashTable *template_attributes;
5282 int template_found = 0;
5285 if (g_regex_match_simple (
"^(?!xml)[[:alpha:]_][[:alnum:]-_.]*$",
5286 page, G_REGEX_CASELESS, 0) == 0)
5289 page = g_strdup (
"_invalid_");
5294 char ctime_now[200];
5298 assert (credentials->
token);
5303 pre = g_markup_printf_escaped
5305 "<version>%s</version>" 5306 "<vendor_version>%s</vendor_version>" 5312 "<charts>%i</charts>" 5314 "<client_address>%s</client_address>" 5315 "<help><%s/></help>",
5327 xml = g_strdup_printf (
"%s" 5328 "<capabilities>%s</capabilities>" 5334 preferred_languages = g_strsplit (credentials->
language,
":", 0);
5337 while (preferred_languages [index] && xsl_filename == NULL)
5339 gchar *help_language;
5340 help_language = g_strdup (preferred_languages [index]);
5341 xsl_filename = g_strdup_printf (
"help_%s.xsl",
5343 if (access (xsl_filename, R_OK) != 0)
5345 g_free (xsl_filename);
5346 xsl_filename = NULL;
5347 if (strchr (help_language,
'_'))
5349 *strchr (help_language,
'_') =
'\0';
5350 xsl_filename = g_strdup_printf (
"help_%s.xsl",
5352 if (access (xsl_filename, R_OK) != 0)
5354 g_free (xsl_filename);
5355 xsl_filename = NULL;
5359 g_free (help_language);
5364 = g_hash_table_new (g_str_hash, g_str_equal);
5366 g_hash_table_insert (template_attributes,
"match", page);
5367 g_hash_table_insert (template_attributes,
"mode",
"help");
5373 = find_element_in_xml_file (xsl_filename,
"xsl:template",
5374 template_attributes);
5377 if (template_found == 0)
5381 = find_element_in_xml_file (
"help.xsl",
"xsl:template",
5382 template_attributes);
5385 if (template_found == 0)
5391 "/help/contents.html", &response_data);
5393 else if (xsl_filename)
5405 g_strfreev (preferred_languages);
5406 g_free (xsl_filename);
5413 "Invalid request", __FUNCTION__, __LINE__,
5414 "Error generating help page.",
5415 "/help/contents.html", &response_data);
5418 response = MHD_create_response_from_buffer (strlen (res), res,
5419 MHD_RESPMEM_MUST_FREE);
5427 #ifdef SERVE_STATIC_ASSETS 5428 response = file_content_response (credentials,
5430 &http_response_code,
5432 &content_disposition);
5437 "/login/login.html", NULL);
5438 response = MHD_create_response_from_buffer (strlen (msg),
5440 MHD_RESPMEM_MUST_COPY);
5454 if (attach_sid (response, sid) == MHD_NO)
5457 MHD_destroy_response (response);
5458 g_warning (
"%s: failed to attach SID, dropping request",
5467 && (strcmp (cmd,
"get_aggregate") == 0
5468 || strcmp (cmd,
"get_assets_chart") == 0
5469 || strcmp (cmd,
"get_tasks_chart") == 0))
5478 credentials_free (credentials);
5479 return handler_send_response (connection,
5482 content_disposition,
5490 credentials_free (credentials);
5491 g_warning (
"%s: memory or file access problem, dropping request",
5497 if (!strcmp (method,
"POST"))
5500 const char *sid, *accept_language;
5504 if (NULL == *con_cls)
5508 struct gsad_connection_info *con_info;
5511 con_info = g_malloc0 (
sizeof (
struct gsad_connection_info));
5513 con_info->postprocessor =
5515 serve_post, (
void *) con_info);
5516 if (NULL == con_info->postprocessor)
5528 con_info->connectiontype = 1;
5529 con_info->answercode = MHD_HTTP_OK;
5531 con_info->content_disposition = NULL;
5532 con_info->content_length = 0;
5533 con_info->redirect = NULL;
5535 *con_cls = (
void *) con_info;
5541 struct gsad_connection_info *con_info = *con_cls;
5542 if (0 != *upload_data_size)
5544 MHD_post_process (con_info->postprocessor, upload_data,
5546 *upload_data_size = 0;
5550 sid = MHD_lookup_connection_value (connection,
5554 con_info->cookie = NULL;
5556 con_info->cookie = g_strdup (sid);
5558 accept_language = MHD_lookup_connection_value (connection,
5562 && g_utf8_validate (accept_language, -1, NULL) == FALSE)
5564 send_response (connection,
5566 MHD_HTTP_BAD_REQUEST, NULL,
5572 get_client_address (connection, client_address);
5573 ret = get_client_address (connection, client_address);
5576 send_response (connection,
5578 MHD_HTTP_BAD_REQUEST, NULL,
5585 ret = exec_omp_post (con_info, &
user, &new_sid, client_address);
5590 url = g_strdup_printf (
"%s&token=%s",
5594 ret = send_redirect_to_urn (connection, url,
user);
5599 if (con_info->redirect)
5601 ret = send_redirect_to_uri (connection, con_info->redirect,
user);
5602 g_free (con_info->redirect);
5603 con_info->redirect = NULL;
5607 xml_flag = con_info->params
5611 if (xml_flag && strcmp (xml_flag,
"0"))
5620 ret = send_response (connection, con_info->response,
5621 con_info->answercode,
5622 new_sid ? new_sid :
"0",
5624 con_info->content_disposition,
5625 con_info->content_length);
5633 g_warning (
"%s: something went wrong, dropping request",
5647 drop_privileges (
struct passwd * user_pw)
5649 if (setgroups (0, NULL))
5651 g_critical (
"%s: failed to set groups: %s\n", __FUNCTION__,
5655 if (setgid (user_pw->pw_gid))
5657 g_critical (
"%s: failed to drop group privileges: %s\n", __FUNCTION__,
5661 if (setuid (user_pw->pw_uid))
5663 g_critical (
"%s: failed to drop user privileges: %s\n", __FUNCTION__,
5681 chroot_drop_privileges (gboolean do_chroot, gchar *drop,
5682 const gchar *subdir)
5684 struct passwd *user_pw;
5688 user_pw = getpwnam (drop);
5689 if (user_pw == NULL)
5691 g_critical (
"%s: Failed to drop privileges." 5692 " Could not determine UID and GID for user \"%s\"!\n",
5705 if (chroot (GSA_DATA_DIR))
5707 g_critical (
"%s: Failed to chroot to \"%s\": %s\n",
5716 if (user_pw && (drop_privileges (user_pw) == FALSE))
5718 g_critical (
"%s: Failed to drop privileges\n",
5725 gchar* root_face_dir = g_build_filename (
"/", subdir, NULL);
5726 if (chdir (root_face_dir))
5728 g_critical (
"%s: failed change to chroot root directory (%s): %s\n",
5732 g_free (root_face_dir);
5735 g_free (root_face_dir);
5739 gchar* data_dir = g_build_filename (GSA_DATA_DIR, subdir, NULL);
5740 if (chdir (data_dir))
5742 g_critical (
"%s: failed to change to \"%s\": %s\n",
5764 my_gnutls_log_func (
int level,
const char *text)
5766 fprintf (stderr,
"[%d] (%d) %s", getpid (), level, text);
5767 if (*text && text[strlen (text) -1] !=
'\n')
5768 putc (
'\n', stderr);
5783 g_debug (
"Initializing the Greenbone Security Assistant...\n");
5786 mutex = g_malloc (
sizeof (GMutex));
5787 g_mutex_init (mutex);
5788 users = g_ptr_array_new ();
5791 if (openvas_file_check_is_dir (GSA_DATA_DIR) < 1)
5793 g_critical (
"%s: Could not access %s!\n", __FUNCTION__, GSA_DATA_DIR);
5799 #if GCRYPT_VERSION_NUMBER < 0x010600 5800 gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
5807 if (!gcry_check_version (NULL))
5809 g_critical (
"%s: libgcrypt version check failed\n", __FUNCTION__);
5815 gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
5823 gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0);
5827 gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
5832 gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
5835 int ret = gnutls_global_init ();
5838 g_critical (
"%s: Failed to initialize GNUTLS.\n", __FUNCTION__);
5845 g_debug (
"Initialization of GSA successful.\n");
5867 pidfile_remove (
"gsad");
5876 handle_signal_exit (
int signal)
5889 register_signal_handlers ()
5891 if (signal (SIGTERM, handle_signal_exit) == SIG_ERR
5892 || signal (SIGINT, handle_signal_exit) == SIG_ERR
5893 || signal (SIGHUP, SIG_IGN) == SIG_ERR
5894 || signal (SIGPIPE, SIG_IGN) == SIG_ERR
5896 || signal (SIGCHLD, SIG_IGN) == SIG_ERR)
5898 || signal (SIGCHLD, SIG_DFL) == SIG_ERR)
5905 mhd_logger (
void *arg,
const char *fmt, va_list ap)
5909 vsnprintf (buf,
sizeof (buf), fmt, ap);
5911 g_warning (
"MHD: %s", buf);
5914 static struct MHD_Daemon *
5915 start_unix_http_daemon (
const char *unix_socket_path,
5916 int handler (
void *,
struct MHD_Connection *,
5917 const char *,
const char *,
const char *,
5918 const char *,
size_t *,
void **))
5920 struct sockaddr_un addr;
5927 g_warning (
"%s: Couldn't create UNIX socket", __FUNCTION__);
5930 addr.sun_family = AF_UNIX;
5931 strncpy (addr.sun_path, unix_socket_path, sizeof (addr.sun_path));
5932 if (!stat (addr.sun_path, &ustat))
5936 unlink (addr.sun_path);
5937 oldmask = umask (~ustat.st_mode);
5939 if (bind (
unix_socket, (
struct sockaddr *) &addr,
sizeof (
struct sockaddr_un))
5942 g_warning (
"%s: Error on bind(%s): %s", __FUNCTION__,
5943 unix_socket_path, strerror (errno));
5950 g_warning (
"%s: Error on listen(): %s", __FUNCTION__, strerror (errno));
5954 return MHD_start_daemon
5955 (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG, 0,
5956 NULL, NULL, handler, NULL, MHD_OPTION_NOTIFY_COMPLETED,
5957 free_resources, NULL, MHD_OPTION_LISTEN_SOCKET,
unix_socket,
5958 MHD_OPTION_PER_IP_CONNECTION_LIMIT, 30,
5959 MHD_OPTION_EXTERNAL_LOGGER, mhd_logger, NULL, MHD_OPTION_END);
5962 static struct MHD_Daemon *
5963 start_http_daemon (
int port,
5964 int handler (
void *,
struct MHD_Connection *,
const char *,
5965 const char *,
const char *,
const char *,
5967 struct sockaddr_storage *address)
5971 if (address->ss_family == AF_INET6)
5973 #if MHD_VERSION >= 0x00092800 5974 ipv6_flag = MHD_USE_DUAL_STACK;
5976 ipv6_flag = MHD_USE_IPv6;
5979 ipv6_flag = MHD_NO_FLAG;
5980 return MHD_start_daemon
5981 (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG | ipv6_flag, port,
5982 NULL, NULL, handler, NULL, MHD_OPTION_NOTIFY_COMPLETED,
5983 free_resources, NULL, MHD_OPTION_SOCK_ADDR, address,
5984 MHD_OPTION_PER_IP_CONNECTION_LIMIT, 30,
5985 MHD_OPTION_EXTERNAL_LOGGER, mhd_logger, NULL, MHD_OPTION_END);
5988 static struct MHD_Daemon *
5989 start_https_daemon (
int port,
const char *key,
const char *cert,
5990 const char *priorities,
const char *dh_params,
5991 struct sockaddr_storage *address)
5995 if (address->ss_family == AF_INET6)
5997 #if MHD_VERSION >= 0x00092800 5998 ipv6_flag = MHD_USE_DUAL_STACK;
6000 ipv6_flag = MHD_USE_IPv6;
6003 ipv6_flag = MHD_NO_FLAG;
6004 return MHD_start_daemon
6005 (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG | MHD_USE_SSL
6006 | ipv6_flag, port, NULL, NULL, &handle_request, NULL,
6007 MHD_OPTION_HTTPS_MEM_KEY, key,
6008 MHD_OPTION_HTTPS_MEM_CERT, cert,
6009 MHD_OPTION_NOTIFY_COMPLETED, free_resources, NULL,
6010 MHD_OPTION_SOCK_ADDR, address,
6011 MHD_OPTION_PER_IP_CONNECTION_LIMIT, 30,
6012 MHD_OPTION_HTTPS_PRIORITIES, priorities,
6013 MHD_OPTION_EXTERNAL_LOGGER, mhd_logger, NULL,
6015 #
if MHD_VERSION >= 0x00093500
6016 dh_params ? MHD_OPTION_HTTPS_MEM_DHPARAMS : MHD_OPTION_END,
6029 gsad_address_set_port (
struct sockaddr_storage *address,
int port)
6031 struct sockaddr_in *gsad_address = (
struct sockaddr_in *) address;
6032 struct sockaddr_in6 *gsad_address6 = (
struct sockaddr_in6 *) address;
6034 gsad_address->sin_port = htons (port);
6035 gsad_address6->sin6_port = htons (port);
6049 gsad_address_init (
const char *address_str,
int port)
6051 struct sockaddr_storage *address = g_malloc0 (
sizeof (*address));
6052 struct sockaddr_in *gsad_address = (
struct sockaddr_in *) address;
6053 struct sockaddr_in6 *gsad_address6 = (
struct sockaddr_in6 *) address;
6055 gsad_address_set_port (address, port);
6058 if (inet_pton (AF_INET6, address_str, &gsad_address6->sin6_addr) > 0)
6059 address->ss_family = AF_INET6;
6060 else if (inet_pton (AF_INET, address_str, &gsad_address->sin_addr) > 0)
6061 address->ss_family = AF_INET;
6064 g_warning (
"Failed to create GSAD address %s", address_str);
6072 gsad_address->sin_addr.s_addr = INADDR_ANY;
6073 gsad_address6->sin6_addr = in6addr_any;
6074 if (ipv6_is_enabled ())
6075 address->ss_family = AF_INET6;
6077 address->ss_family = AF_INET;
6092 main (
int argc,
char **argv)
6100 sigset_t sigmask_all, sigmask_current;
6104 if (gsad_init () == MHD_NO)
6106 g_critical (
"%s: Initialization failed!\nExiting...\n", __FUNCTION__);
6107 exit (EXIT_FAILURE);
6112 static gboolean do_chroot = FALSE;
6113 static gchar *drop = NULL;
6114 static gboolean foreground = FALSE;
6115 static gboolean http_only = FALSE;
6116 static gboolean print_version = FALSE;
6117 static gboolean no_redirect = FALSE;
6118 static gboolean secure_cookie = FALSE;
6120 static gchar **gsad_address_string = NULL;
6121 static gchar **gsad_header_host_strings = NULL;
6122 static gchar *gsad_manager_address_string = NULL;
6123 static gchar *gsad_manager_unix_socket_path = NULL;
6124 static gchar *gsad_port_string = NULL;
6125 static gchar *gsad_redirect_port_string = NULL;
6126 static gchar *gsad_manager_port_string = NULL;
6127 static gchar *gsad_vendor_version_string = NULL;
6128 static gchar *gsad_login_label_name = NULL;
6129 static gchar *ssl_private_key_filename = OPENVAS_SERVER_KEY;
6130 static gchar *ssl_certificate_filename = OPENVAS_SERVER_CERTIFICATE;
6131 static gchar *dh_params_filename = NULL;
6132 static gchar *unix_socket_path = NULL;
6133 static gchar *gnutls_priorities =
"NORMAL";
6134 static int debug_tls = 0;
6135 static gchar *face_name = NULL;
6136 static gchar *guest_user = NULL;
6137 static gchar *guest_pass = NULL;
6140 static gchar *http_guest_chart_frame_opts
6142 static gchar *http_guest_chart_csp
6144 static int hsts_enabled = FALSE;
6146 static gboolean ignore_x_real_ip = FALSE;
6147 static int verbose = 0;
6148 GError *error = NULL;
6149 GOptionContext *option_context;
6150 static GOptionEntry option_entries[] = {
6151 {
"allow-header-host",
'\0',
6152 0, G_OPTION_ARG_STRING_ARRAY, &gsad_header_host_strings,
6153 "Allow <host> as hostname/address part of a Host header." 6155 {
"drop-privileges",
'\0',
6156 0, G_OPTION_ARG_STRING, &drop,
6157 "Drop privileges to <user>.",
"<user>" },
6159 0, G_OPTION_ARG_NONE, &foreground,
6160 "Run in foreground.", NULL},
6162 0, G_OPTION_ARG_NONE, &http_only,
6163 "Serve HTTP only, without SSL.", NULL},
6166 0, G_OPTION_ARG_STRING_ARRAY, &gsad_address_string,
6167 "Listen on <address>.",
"<address>" },
6169 0, G_OPTION_ARG_STRING, &gsad_manager_address_string,
6170 "Manager address.",
"<address>" },
6172 0, G_OPTION_ARG_STRING, &gsad_port_string,
6173 "Use port number <number>.",
"<number>"},
6175 0, G_OPTION_ARG_STRING, &gsad_manager_port_string,
6176 "Use manager port number <number>.",
"<number>"},
6178 0, G_OPTION_ARG_STRING, &gsad_redirect_port_string,
6179 "Redirect HTTP from this port number <number>.",
"<number>"},
6180 {
"no-redirect",
'\0',
6181 0, G_OPTION_ARG_NONE, &no_redirect,
6182 "Don't redirect HTTP to HTTPS.", NULL },
6184 0, G_OPTION_ARG_NONE, &verbose,
6185 "Has no effect. See INSTALL for logging config.", NULL },
6187 0, G_OPTION_ARG_NONE, &print_version,
6188 "Print version and exit.", NULL},
6189 {
"vendor-version",
'\0',
6190 0, G_OPTION_ARG_STRING, &gsad_vendor_version_string,
6191 "Use <string> as version in interface.",
"<string>"},
6192 {
"login-label",
'\0',
6193 0, G_OPTION_ARG_STRING, &gsad_login_label_name,
6194 "Use <string> as login label.",
"<string>"},
6195 {
"ssl-private-key",
'k',
6196 0, G_OPTION_ARG_FILENAME, &ssl_private_key_filename,
6197 "Use <file> as the private key for HTTPS",
"<file>"},
6198 {
"ssl-certificate",
'c',
6199 0, G_OPTION_ARG_FILENAME, &ssl_certificate_filename,
6200 "Use <file> as the certificate for HTTPS",
"<file>"},
6202 0, G_OPTION_ARG_FILENAME, &dh_params_filename,
6203 "Diffie-Hellman parameters file",
"<file>"},
6205 0, G_OPTION_ARG_NONE, &do_chroot,
6206 "Do chroot.", NULL},
6207 {
"secure-cookie",
'\0',
6208 0, G_OPTION_ARG_NONE, &secure_cookie,
6209 "Use a secure cookie (implied when using HTTPS).", NULL},
6211 0, G_OPTION_ARG_INT, &timeout,
6212 "Minutes of user idle time before session expires.",
"<number>"},
6213 {
"client-watch-interval",
'\0',
6215 "Check if client connection was closed every <number> seconds." 6220 0, G_OPTION_ARG_INT, &debug_tls,
6221 "Enable TLS debugging at <level>",
"<level>"},
6222 {
"gnutls-priorities",
'\0',
6223 0, G_OPTION_ARG_STRING, &gnutls_priorities,
6224 "GnuTLS priorities string.",
"<string>"},
6226 0, G_OPTION_ARG_STRING, &face_name,
6227 "Use interface files from subdirectory <dir>",
"<dir>"},
6228 {
"guest-username", 0,
6229 0, G_OPTION_ARG_STRING, &guest_user,
6230 "Username for guest user. Enables guest logins.",
"<name>"},
6231 {
"guest-password", 0,
6232 0, G_OPTION_ARG_STRING, &guest_pass,
6233 "Password for guest user. Defaults to guest username.",
"<password>"},
6234 {
"http-frame-opts", 0,
6235 0, G_OPTION_ARG_STRING, &http_frame_opts,
6236 "X-Frame-Options HTTP header. Defaults to \"" 6239 0, G_OPTION_ARG_STRING, &http_csp,
6240 "Content-Security-Policy HTTP header. Defaults to \"" 6242 {
"http-guest-chart-frame-opts", 0,
6243 0, G_OPTION_ARG_STRING, &http_guest_chart_frame_opts,
6244 "X-Frame-Options HTTP header for guest charts. Defaults to \"" 6246 {
"http-guest-chart-csp", 0,
6247 0, G_OPTION_ARG_STRING, &http_guest_chart_csp,
6248 "Content-Security-Policy HTTP header. Defaults to \"" 6251 0, G_OPTION_ARG_NONE, &hsts_enabled,
6252 "Enable HTTP Strict-Tranport-Security header.", NULL},
6253 {
"http-sts-max-age", 0,
6254 0, G_OPTION_ARG_INT, &hsts_max_age,
6255 "max-age in seconds for HTTP Strict-Tranport-Security header." 6258 {
"ignore-x-real-ip",
'\0',
6259 0, G_OPTION_ARG_NONE, &ignore_x_real_ip,
6260 "Do not use X-Real-IP to determine the client address.", NULL},
6261 {
"unix-socket",
'\0',
6262 0, G_OPTION_ARG_FILENAME, &unix_socket_path,
6263 "Path to unix socket to listen on",
"<file>"},
6264 {
"munix-socket",
'\0',
6265 0, G_OPTION_ARG_FILENAME, &gsad_manager_unix_socket_path,
6266 "Path to Manager unix socket",
"<file>"},
6271 g_option_context_new (
"- Greenbone Security Assistant Daemon");
6272 g_option_context_add_main_entries (option_context, option_entries, NULL);
6273 if (!g_option_context_parse (option_context, &argc, &argv, &error))
6275 g_critical (
"%s: %s\n\n", __FUNCTION__, error->message);
6276 exit (EXIT_FAILURE);
6278 g_option_context_free (option_context);
6287 if (http_only == FALSE && hsts_enabled)
6290 = g_strdup_printf (
"max-age=%d",
6291 hsts_max_age >= 0 ? hsts_max_age
6299 if (register_signal_handlers ())
6301 g_critical (
"Failed to register signal handlers!\n");
6302 exit (EXIT_FAILURE);
6307 printf (
"Greenbone Security Assistant %s\n", GSAD_VERSION);
6308 #ifdef GSAD_GIT_REVISION 6309 printf (
"GIT revision %s\n", GSAD_GIT_REVISION);
6313 printf (
"gnutls %s\n", gnutls_check_version (NULL));
6314 printf (
"libmicrohttpd %s\n", MHD_get_version ());
6316 printf (
"Copyright (C) 2010-2016 Greenbone Networks GmbH\n");
6317 printf (
"License GPLv2+: GNU GPL version 2 or later\n");
6319 (
"This is free software: you are free to change and redistribute it.\n" 6320 "There is NO WARRANTY, to the extent permitted by law.\n\n");
6321 exit (EXIT_SUCCESS);
6326 gnutls_global_set_log_function (my_gnutls_log_func);
6327 gnutls_global_set_log_level (debug_tls);
6333 g_critical (
"%s: libxml must be compiled with thread support\n",
6335 exit (EXIT_FAILURE);
6338 if (gsad_vendor_version_string)
6341 if (gsad_login_label_name)
6345 g_critical (
"Invalid character in login label name\n");
6346 exit (EXIT_FAILURE);
6350 if (no_redirect && gsad_redirect_port_string)
6352 g_warning (
"--no-redirect option given with --rport");
6358 if (setenv (
"TZ",
"utc 0", 1) == -1)
6360 g_critical (
"%s: failed to set timezone\n", __FUNCTION__);
6361 exit (EXIT_FAILURE);
6367 rc_name = g_build_filename (GSA_CONFIG_DIR,
"gsad_log.conf", NULL);
6368 if (g_file_test (rc_name, G_FILE_TEST_EXISTS))
6369 log_config = load_log_configuration (rc_name);
6376 #ifdef GSAD_GIT_REVISION 6377 g_message (
"Starting GSAD version %s (GIT revision %s)\n",
6381 g_message (
"Starting GSAD version %s\n",
6389 if ((timeout < 1) || (timeout > 1440))
6391 g_critical (
"%s: Timeout must be a number from 1 to 1440\n",
6393 exit (EXIT_FAILURE);
6410 if (gsad_port_string)
6412 gsad_port = atoi (gsad_port_string);
6413 if (gsad_port <= 0 || gsad_port >= 65536)
6415 g_critical (
"%s: Port must be a number between 0 and 65536\n",
6417 exit (EXIT_FAILURE);
6421 if (gsad_manager_port_string)
6423 gsad_manager_port = atoi (gsad_manager_port_string);
6424 if (gsad_manager_port <= 0 || gsad_manager_port >= 65536)
6426 g_critical (
"%s: Manager port must be a number between 0 and 65536\n",
6428 exit (EXIT_FAILURE);
6433 old_locale = g_strdup (setlocale (LC_ALL, NULL));
6435 locale = setlocale (LC_ALL,
"");
6439 "Failed to set locale according to environment variables," 6440 " gettext translations are disabled.",
6444 else if (strcmp (locale,
"C") == 0)
6446 g_message (
"%s: Locale for gettext extensions set to \"C\"," 6447 " gettext translations are disabled.",
6453 if (strcasestr (locale,
"en_") != locale)
6455 g_warning (
"%s: Locale defined by environment variables" 6456 " is not an \"en_...\" one.",
6461 if (strcasecmp (nl_langinfo (CODESET),
"UTF-8"))
6462 g_warning (
"%s: Locale defined by environment variables" 6463 " does not use UTF-8 encoding.",
6466 g_debug (
"%s: gettext translation extensions are enabled" 6467 " (using locale \"%s\").",
6468 __FUNCTION__, locale);
6472 setlocale (LC_ALL, old_locale);
6473 g_free (old_locale);
6477 if (gsad_redirect_port_string)
6479 gsad_redirect_port = atoi (gsad_redirect_port_string);
6480 if (gsad_redirect_port <= 0 || gsad_redirect_port >= 65536)
6482 g_critical (
"%s: Redirect port must be a number between 0 and 65536\n",
6484 exit (EXIT_FAILURE);
6488 if (foreground == FALSE)
6491 g_debug (
"Forking...\n");
6492 pid_t pid = fork ();
6500 g_critical (
"%s: Failed to fork!\n", __FUNCTION__);
6501 exit (EXIT_FAILURE);
6505 exit (EXIT_SUCCESS);
6513 if (unix_socket_path)
6516 g_debug (
"Forking for unix socket...\n");
6517 pid_t pid = fork ();
6523 if (prctl (PR_SET_PDEATHSIG, SIGKILL))
6524 g_warning (
"%s: Failed to change parent death signal;" 6525 " unix socket process will remain if parent is killed:" 6533 g_warning (
"%s: Failed to fork for unix socket!\n", __FUNCTION__);
6534 exit (EXIT_FAILURE);
6547 g_debug (
"Forking for redirect...\n");
6548 pid_t pid = fork ();
6554 if (prctl (PR_SET_PDEATHSIG, SIGKILL))
6555 g_warning (
"%s: Failed to change parent death signal;" 6556 " redirect process will remain if parent is killed:" 6566 g_critical (
"%s: Failed to fork for redirect!\n", __FUNCTION__);
6567 exit (EXIT_FAILURE);
6579 if (atexit (&gsad_cleanup))
6581 g_critical (
"%s: Failed to register cleanup function!\n", __FUNCTION__);
6582 exit (EXIT_FAILURE);
6587 if (pidfile_create (
"gsad"))
6589 g_critical (
"%s: Could not write PID file.\n", __FUNCTION__);
6590 exit (EXIT_FAILURE);
6597 if (gsad_address_string)
6602 while (*gsad_address_string)
6604 if (gsad_address_init (*gsad_address_string, gsad_port))
6606 gsad_address_string++;
6614 if (gsad_address_init (NULL, gsad_port))
6618 if (gsad_header_host_strings)
6619 while (*gsad_header_host_strings)
6622 g_strdup (*gsad_header_host_strings));
6623 gsad_header_host_strings ++;
6626 g_debug (
"Accepting %d host addresses in Host headers",
6630 GHashTableIter iter;
6633 while (g_hash_table_iter_next (&iter, (
void**)(&hostname), NULL))
6635 g_debug (
"- %s\n", hostname);
6646 gsad_address_set_port (list->data, gsad_redirect_port);
6647 gsad_daemon = start_http_daemon (gsad_redirect_port, redirect_handler,
6654 g_warning (
"%s: start_http_daemon redirect failed !", __FUNCTION__);
6655 return EXIT_FAILURE;
6659 g_debug (
"GSAD started successfully and is redirecting on port %d.\n",
6660 gsad_redirect_port);
6663 else if (unix_socket_path && !
unix_pid)
6667 omp_init (gsad_manager_unix_socket_path,
6668 gsad_manager_address_string,
6671 gsad_daemon = start_unix_http_daemon (unix_socket_path, handle_request);
6675 g_warning (
"%s: start_unix_http_daemon failed !", __FUNCTION__);
6676 return EXIT_FAILURE;
6680 g_debug (
"GSAD started successfully and is listening on unix" 6689 omp_init (gsad_manager_unix_socket_path,
6690 gsad_manager_address_string,
6699 gsad_daemon = start_http_daemon (gsad_port, handle_request,
6701 if (
gsad_daemon == NULL && gsad_port_string == NULL)
6703 g_warning (
"Binding to port %d failed, trying default port" 6706 gsad_address_set_port (list->data, gsad_port);
6707 gsad_daemon = start_http_daemon (gsad_port, handle_request,
6715 gchar *ssl_private_key = NULL;
6716 gchar *ssl_certificate = NULL;
6717 gchar *dh_params = NULL;
6722 if (!g_file_get_contents (ssl_private_key_filename, &ssl_private_key,
6725 g_critical (
"%s: Could not load private SSL key from %s: %s\n",
6727 ssl_private_key_filename,
6729 g_error_free (error);
6730 exit (EXIT_FAILURE);
6733 if (!g_file_get_contents (ssl_certificate_filename, &ssl_certificate,
6736 g_critical (
"%s: Could not load SSL certificate from %s: %s\n",
6738 ssl_certificate_filename,
6740 g_error_free (error);
6741 exit (EXIT_FAILURE);
6744 if (dh_params_filename &&
6745 !g_file_get_contents (dh_params_filename, &dh_params, NULL,
6748 g_critical (
"%s: Could not load SSL certificate from %s: %s\n",
6749 __FUNCTION__, dh_params_filename, error->message);
6750 g_error_free (error);
6751 exit (EXIT_FAILURE);
6757 (gsad_port, ssl_private_key, ssl_certificate,
6758 gnutls_priorities, dh_params, list->data);
6759 if (
gsad_daemon == NULL && gsad_port_string == NULL)
6761 g_warning (
"Binding to port %d failed, trying default port" 6764 gsad_address_set_port (list->data, gsad_port);
6766 (gsad_port, ssl_private_key, ssl_certificate,
6767 gnutls_priorities, dh_params, list->data);
6775 g_critical (
"%s: start_https_daemon failed!\n", __FUNCTION__);
6776 return EXIT_FAILURE;
6780 g_debug (
"GSAD started successfully and is listening on port %d.\n",
6787 if (chroot_drop_privileges (do_chroot, drop,
6792 g_critical (
"%s: Cannot use custom face \"%s\".\n",
6793 __FUNCTION__, face_name);
6794 exit (EXIT_FAILURE);
6798 g_critical (
"%s: Cannot use default face \"%s\"!\n",
6800 exit (EXIT_FAILURE);
6807 if (sigfillset (&sigmask_all))
6809 g_critical (
"%s: Error filling signal set\n", __FUNCTION__);
6810 exit (EXIT_FAILURE);
6812 if (pthread_sigmask (SIG_BLOCK, &sigmask_all, &sigmask_current))
6814 g_critical (
"%s: Error setting signal mask\n", __FUNCTION__);
6815 exit (EXIT_FAILURE);
6828 if (pselect (0, NULL, NULL, NULL, NULL, &sigmask_current) == -1)
6832 g_critical (
"%s: pselect: %s\n", __FUNCTION__, strerror (errno));
6833 exit (EXIT_FAILURE);
6836 return EXIT_SUCCESS;
int openvas_validator_alias(validator_t validator, const char *alias, const char *name)
Make an alias for a rule name.
int download_credential_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, gsize *result_len, char **html, char **login, cmd_response_data_t *response_data)
Export a Credential in a defined format.
char * export_filter_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a filter.
char * export_user_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a user.
char * edit_agent(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit_agent XML, XSL transform the result.
#define HOST_HEADER_ERROR_PAGE
#define DEFAULT_GSAD_HTTP_PORT
Fallback GSAD port for HTTP.
char * export_agents_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of agents.
struct MHD_Daemon * gsad_daemon
The handle on the embedded HTTP daemon.
char * address
Client's IP address.
gchar * pw_warning
Password policy warning.
int authenticate_omp(const gchar *username, const gchar *password, gchar **role, gchar **timezone, gchar **severity, gchar **capabilities, gchar **language, gchar **pw_warning, GTree **chart_prefs, gchar **autorefresh)
Check authentication credentials.
char * export_report_formats_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of Report Formats.
char * download_ssl_cert(openvas_connection_t *connection, credentials_t *credentials, params_t *params, gsize *response_size, cmd_response_data_t *response_data)
Get an SSL Certificate.
void set_ext_gettext_enabled(int enabled)
Enable or disable gettext functions for extensions.
int gsad_base_cleanup()
Base init.
char * export_permissions_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of permissions.
char * edit_filter(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit_filter XML, XSL transform the result.
char * export_asset_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export an asset.
char * export_permission_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a permission.
user_t * user_add(const gchar *username, const gchar *password, const gchar *timezone, const gchar *severity, const gchar *role, const gchar *capabilities, const gchar *language, const gchar *pw_warning, GTree *chart_prefs, const gchar *autorefresh, const char *address)
Add a user.
char * save_my_settings_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *accept_language, char **timezone, char **password, char **severity, char **language, cmd_response_data_t *response_data)
Returns page with user's settings, for editing.
void cmd_response_data_init(cmd_response_data_t *data)
Initializes a cmd_response_data_t struct.
int user_set_chart_pref(const gchar *token, gchar *pref_id, gchar *pref_value)
Set a chart preference of a user.
char * capabilities
Capabilites of manager.
#define USER_GUEST_LOGIN_ERROR
#define DEFAULT_GSAD_FACE
Default face name.
param_t * params_get(params_t *params, const char *name)
Get param.
char * timezone
User's timezone.
content_type
Content types.
gchar * language
User Interface Language, in short form like "en".
char * export_users_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of users.
char * gsad_message(credentials_t *credentials, const char *title, const char *function, int line, const char *msg, const char *backurl, cmd_response_data_t *response_data)
Handles fatal errors.
char * edit_scanner(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit_scanner XML, XSL transform the result.
char * export_agent_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a agent.
char * SERVER_ERROR
Server error HTML.
#define DEFAULT_GSAD_LANGUAGE
Default language code, used when Accept-Language header is missing.
char * edit_asset(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit XML, XSL transform the result.
int params_given(params_t *params, const char *name)
Get whether a param was given at all.
#define USER_BAD_MISSING_COOKIE
gchar * guest_username
Guest username.
int user_set_language(const gchar *token, const gchar *language)
Set language of user.
char * save_user_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, char **password_return, char **modified_user, int *logout_user, cmd_response_data_t *response_data)
Modify a user, get all users, XSL transform the result.
gchar * http_guest_chart_x_frame_options
Current guest chart specific value for HTTP header "X-Frame-Options".
int unix_socket
Unix socket to listen on.
char * export_roles_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of roles.
char * export_preference_file_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a file preference.
char * caller
Caller URL, for POST relogin.
char * export_tags_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of tags.
char * export_results_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of results.
int charts
Whether to show charts for this user.
Response information for commands.
GHashTable * gsad_header_hosts
Host names and IP accepted in the "Host" HTTP header.
void omp_init(const gchar *manager_address_unix, const gchar *manager_address_tls, int port_manager)
Init the GSA OMP library.
#define DEFAULT_GSAD_X_FRAME_OPTIONS
Default value for HTTP header "X-Frame-Options".
char * logout(credentials_t *credentials, const gchar *message, cmd_response_data_t *response_data)
Setup edit_user XML, XSL transform the result.
validator_t openvas_validator_new()
Create a new validator.
void user_remove(user_t *user)
Remove a user from the session "database", releasing the user_t too.
char * download_key_pub(openvas_connection_t *connection, credentials_t *credentials, params_t *params, gsize *response_size, cmd_response_data_t *response_data)
Get a Scanner's Certificate.
char * dashboard(openvas_connection_t *connection, credentials_t *credentials, params_t *params, cmd_response_data_t *response_data)
Show a dashboard.
char * new_permissions(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup new_permissions XML, XSL transform the result.
char * cvss_calculator(openvas_connection_t *connection, credentials_t *credentials, params_t *params, cmd_response_data_t *response_data)
void params_free(params_t *params)
Make a params.
void set_chroot_state(int state)
Sets the chroot state.
char * new_override(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Return the new overrides page.
int session_timeout
Maximum number of minutes of user idle time.
#define DEFAULT_GSAD_GUEST_CHART_X_FRAME_OPTIONS
Default value for HTTP header "X-Frame-Options" for guest charts.
void set_language_code(gchar **lang, const gchar *language)
Set language code of user.
void set_http_only(int state)
Sets the http_only state.
#define USER_GUEST_LOGIN_FAILED
#define SESSION_TIMEOUT
Max number of minutes between activity in a session.
#define MHD_HTTP_NOT_ACCEPTABLE
The symbol is deprecated, but older versions (0.9.37 - Debian jessie) don't define it yet...
gchar * capabilities
Capabilities.
void openvas_validator_add(validator_t validator, const char *name, const char *regex)
Add or overwrite a validation rule.
void cmd_response_data_reset(cmd_response_data_t *data)
Clears a cmd_response_data_t struct.
#define USER_IP_ADDRESS_MISSMATCH
gchar * guest_password
Guest password.
char * edit_schedule(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit_schedule XML, XSL transform the result.
char * export_task_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a task.
Structure of credential related information.
char * export_configs_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of scan configs.
const char * params_original_value(params_t *params, const char *name)
Get original value of param, before validation.
GTree * chart_prefs
Chart preferences.
gchar * severity
Severity class.
#define DEFAULT_GSAD_PORT
Fallback unprivileged GSAD port.
char * edit_tag(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit_tag XML, XSL transform the result.
gchar * accept_language_to_env_fmt(const char *accept_language)
Convert an Accept-Language string to the LANGUAGE env variable form.
int user_set_password(const gchar *token, const gchar *password)
Set password of user.
char * username
Name of user.
const char * NOT_FOUND_TITLE
Title for "Page not found" messages.
char * get_system_report_omp(openvas_connection_t *connection, credentials_t *credentials, const char *url, params_t *params, enum content_type *content_type, gsize *content_length, cmd_response_data_t *response_data)
Return system report image.
char * export_port_list_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a Port List.
gchar * openvas_validator_alias_for(validator_t validator, const char *alias)
Get the name of the rule for which a rule is an alias.
char * edit_user(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit_user XML, XSL transform the result.
char * export_config_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a config.
char * process_bulk_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Returns a process_bulk page.
GSList * address_list
The IP addresses of this program, "the GSAD".
char * export_report_format_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a report format.
int user_set_autorefresh(const gchar *token, const gchar *autorefresh)
Set default autorefresh interval of user.
char * edit_alert(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit_alert XML, XSL transform the result.
char * edit_note(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Edit note, get next page, XSL transform the result.
GSList * log_config
Logging parameters, as passed to setup_log_handlers.
Headers/structs for a string validator.
char * autorefresh
Auto-refresh interval.
GTree * last_filt_ids
Last filter ids.
char * client_address
Client's address.
int openvas_validate(validator_t validator, const char *name, const char *value)
Validate a string for a given rule.
char * get_report_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, gsize *report_len, gchar **content_type, char **content_disposition, cmd_response_data_t *response_data)
Get a report and XSL transform the result.
char * edit_override(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Edit override, get next page, XSL transform the result.
char * token
Request session token.
gchar * timezone
Timezone.
char * export_alerts_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of alerts.
#define DEFAULT_GSAD_HSTS_MAX_AGE
Default "max-age" for HTTP header "Strict-Transport-Security".
char * export_credential_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a Credential.
Headers/structs used generally in GSA.
char * export_schedules_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of schedules.
#define MAX_FILE_NAME_SIZE
Maximum length of "file name" for /help/ URLs.
void vendor_version_set(const gchar *version)
Set the vendor version.
pid_t unix_pid
PID of unix socket child in parent, 0 in child.
validator_t validator
Parameter validator.
struct timeval cmd_start
Seconds since command page handler started.
gchar * login_xml(const gchar *message, const gchar *token, const gchar *time, const gchar *url, const gchar *i18n, const gchar *guest)
Generate XML for login page.
pid_t redirect_pid
PID of redirect child in parent, 0 in child.
int guest
Whether the user is a guest.
int download_agent_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, gsize *result_len, char **html, char **filename, cmd_response_data_t *response_data)
Get an agent, XSL transform the result.
char * export_tasks_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of tasks.
char * BAD_REQUEST_PAGE
Bad request error HTML.
char * export_credentials_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of Credentials.
#define SID_COOKIE_NAME
Name of the cookie used to store the SID.
char * xsl_transform_with_stylesheet(const char *xml_text, const char *xsl_stylesheet, cmd_response_data_t *response_data)
XSL Transformation.
char * save_chart_preference_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, gchar **pref_id, gchar **pref_value, cmd_response_data_t *response_data)
Save chart preferences.
params_t * params_new()
Make a params.
#define USER_BAD_MISSING_TOKEN
char * export_note_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a note.
void user_release(user_t *user)
Release a user_t returned by user_add or user_find.
char * export_port_lists_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of Port Lists.
#define DEFAULT_GSAD_HTTPS_PORT
Fallback GSAD port for HTTPS.
int user_logout_all_sessions(const gchar *username, credentials_t *credentials)
Logs out all sessions of a given user, except the current one.
char * get_info(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Requests SecInfo.
char * export_groups_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of groups.
int chroot_state
Whether chroot is used.
int user_set_severity(const gchar *token, const gchar *severity)
Set severity class of user.
char * export_targets_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of targets.
gchar * http_x_frame_options
Current value for HTTP header "X-Frame-Options".
int gsad_base_init()
Base init.
GPtrArray * users
User session data.
#define USER_EXPIRED_TOKEN
int guest
Whether the user is a guest user.
param_t * params_append_bin(params_t *params, const char *name, const char *chunk_data, int chunk_size, int chunk_offset)
Append binary data to a param.
gchar * username
Login name.
char * export_assets_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of assets.
char * token
Session token.
char * export_override_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export an override.
const char * params_value(params_t *params, const char *name)
Get value of param.
char * new_filter_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, cmd_response_data_t *response_data)
Returns page to create a new filter.
char * export_scanners_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of scanners.
char * export_alert_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export an alert.
char * download_ca_pub(openvas_connection_t *connection, credentials_t *credentials, params_t *params, gsize *response_size, cmd_response_data_t *response_data)
Get a Scanner's CA Certificate.
gboolean params_iterator_next(params_iterator_t *iterator, char **name, param_t **param)
Increment a params iterator.
GTree * last_filt_ids
Last used filter ids.
int init_language_lists()
Initialize the list of available languages.
char * role
User's role.
char * edit_target(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit_target XML, XSL transform the result.
const gchar * vendor_version_get()
Get the vendor version.
int charts
Whether to show charts for this user.
char * export_scanner_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a scanner.
char * pw_warning
Password policy warning message.
User information structure, for sessions.
int user_find(const gchar *cookie, const gchar *token, const char *address, user_t **user_return)
Find a user, given a token and cookie.
gchar * redirect
HTTP status code.
char * export_schedule_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a schedule.
char * export_omp_doc_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Download the OMP doc.
void add_guest_chart_content_security_headers(struct MHD_Response *response)
Add guest chart content security headers to a MHD response.
gchar * http_content_security_policy
Current value for HTTP header "Content-Security-Policy".
char * export_group_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a group.
char * xsl_transform(const char *xml_text, cmd_response_data_t *response_data)
XSL Transformation.
#define UTF8_ERROR_PAGE(location)
void init_validator()
Initialise the parameter validator.
GHashTable * validator_t
A set of name rule pairs.
GTree * chart_prefs
Chart preferences.
#define DEFAULT_CLIENT_WATCH_INTERVAL
Default value for client_watch_interval.
volatile int termination_signal
Flag for signal handler.
char * new_note(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Return the new notes page.
char * get_report_section_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, cmd_response_data_t *response_data)
Get a report section, XSL transform the result.
const char * ERROR_PAGE
Error page HTML.
char * severity
Severity class.
gchar * http_guest_chart_content_security_policy
Current guest chart value for HTTP header "Content-Security-Policy".
char * export_target_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a target.
#define DEFAULT_GSAD_REDIRECT_PORT
Fallback GSAD port.
gboolean ignore_http_x_real_ip
Current preference for using X_Real_IP from HTTP header.
gchar * password
Password.
void add_security_headers(struct MHD_Response *response)
Add security headers to a MHD response.
#define params_iterator_init
char * current_page
Current page URL, for refresh.
const char * NOT_FOUND_MESSAGE
Main message for "Page not found" messages.
char * language
Accept-Language browser header.
gchar * redirect_location
Location for redirection server.
int user_set_timezone(const gchar *token, const gchar *timezone)
Set timezone of user.
char * cookie
Cookie token.
char * new_permission(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup new_permission XML, XSL transform the result.
char * export_filters_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of filters.
int use_secure_cookie
Whether to use a secure cookie.
int manager_connect(credentials_t *credentials, openvas_connection_t *connection, cmd_response_data_t *response_data)
Connect to OpenVAS Manager daemon.
#define DEFAULT_OPENVAS_MANAGER_PORT
Fallback Manager port.
params_t * params
Request parameters.
char * ctime_r_strip_newline(time_t *time, char *string)
Return string from ctime_r with newline replaces with terminator.
gchar * autorefresh
Auto-Refresh interval.
char * export_role_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a role.
#define params_iterator_t
GCRY_THREAD_OPTION_PTHREAD_IMPL
Libgcrypt thread callback definition for libgcrypt < 1.6.0.
Headers for GSA's OMP communication module.
char * export_result_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a result.
char * edit_group(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit_group XML, XSL transform the result.
char * edit_permission(openvas_connection_t *connection, credentials_t *credentials, params_t *params, const char *extra_xml, cmd_response_data_t *response_data)
Setup edit_permission XML, XSL transform the result.
#define POST_BUFFER_SIZE
Buffer size for POST processor.
int client_watch_interval
Interval in seconds to check whether client connection was closed.
int user_set_charts(const gchar *token, const int charts)
Set charts setting of user.
int label_name_set(const gchar *name)
Set the login label.
gchar * http_strict_transport_security
Current value of for HTTP header "Strict-Transport-Security".
int token_user_remove(const char *token)
Remove a user from the session "database", releasing the user_t too.
char * password
User's password.
char * export_notes_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of notes.
param_t * params_add(params_t *params, const char *name, const char *value)
Add a param.
#define DEFAULT_GSAD_GUEST_CHART_CONTENT_SECURITY_POLICY
Default guest charts value for HTTP header "Content-Security-Policy".
char * export_tag_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a tag.
char * export_overrides_omp(openvas_connection_t *connection, credentials_t *credentials, params_t *params, enum content_type *content_type, char **content_disposition, gsize *content_length, cmd_response_data_t *response_data)
Export a list of overrides.
#define DEFAULT_GSAD_CONTENT_SECURITY_POLICY
Default value for HTTP header "Content-Security-Policy".
int token_user(const gchar *token, user_t **user_return)
Find a user, given a token.