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__);
5931 memset (&addr, 0,
sizeof (
struct sockaddr_un));
5933 addr.sun_family = AF_UNIX;
5934 strncpy (addr.sun_path, unix_socket_path, sizeof (addr.sun_path) - 1);
5935 if (!stat (addr.sun_path, &ustat))
5939 unlink (addr.sun_path);
5940 oldmask = umask (~ustat.st_mode);
5942 if (bind (
unix_socket, (
struct sockaddr *) &addr,
sizeof (
struct sockaddr_un))
5945 g_warning (
"%s: Error on bind(%s): %s", __FUNCTION__,
5946 unix_socket_path, strerror (errno));
5953 g_warning (
"%s: Error on listen(): %s", __FUNCTION__, strerror (errno));
5957 return MHD_start_daemon
5958 (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG, 0,
5959 NULL, NULL, handler, NULL, MHD_OPTION_NOTIFY_COMPLETED,
5960 free_resources, NULL, MHD_OPTION_LISTEN_SOCKET,
unix_socket,
5961 MHD_OPTION_PER_IP_CONNECTION_LIMIT, 30,
5962 MHD_OPTION_EXTERNAL_LOGGER, mhd_logger, NULL, MHD_OPTION_END);
5965 static struct MHD_Daemon *
5966 start_http_daemon (
int port,
5967 int handler (
void *,
struct MHD_Connection *,
const char *,
5968 const char *,
const char *,
const char *,
5970 struct sockaddr_storage *address)
5974 if (address->ss_family == AF_INET6)
5976 #if MHD_VERSION >= 0x00092800 5977 ipv6_flag = MHD_USE_DUAL_STACK;
5979 ipv6_flag = MHD_USE_IPv6;
5982 ipv6_flag = MHD_NO_FLAG;
5983 return MHD_start_daemon
5984 (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG | ipv6_flag, port,
5985 NULL, NULL, handler, NULL, MHD_OPTION_NOTIFY_COMPLETED,
5986 free_resources, NULL, MHD_OPTION_SOCK_ADDR, address,
5987 MHD_OPTION_PER_IP_CONNECTION_LIMIT, 30,
5988 MHD_OPTION_EXTERNAL_LOGGER, mhd_logger, NULL, MHD_OPTION_END);
5991 static struct MHD_Daemon *
5992 start_https_daemon (
int port,
const char *key,
const char *cert,
5993 const char *priorities,
const char *dh_params,
5994 struct sockaddr_storage *address)
5998 if (address->ss_family == AF_INET6)
6000 #if MHD_VERSION >= 0x00092800 6001 ipv6_flag = MHD_USE_DUAL_STACK;
6003 ipv6_flag = MHD_USE_IPv6;
6006 ipv6_flag = MHD_NO_FLAG;
6007 return MHD_start_daemon
6008 (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG | MHD_USE_SSL
6009 | ipv6_flag, port, NULL, NULL, &handle_request, NULL,
6010 MHD_OPTION_HTTPS_MEM_KEY, key,
6011 MHD_OPTION_HTTPS_MEM_CERT, cert,
6012 MHD_OPTION_NOTIFY_COMPLETED, free_resources, NULL,
6013 MHD_OPTION_SOCK_ADDR, address,
6014 MHD_OPTION_PER_IP_CONNECTION_LIMIT, 30,
6015 MHD_OPTION_HTTPS_PRIORITIES, priorities,
6016 MHD_OPTION_EXTERNAL_LOGGER, mhd_logger, NULL,
6018 #
if MHD_VERSION >= 0x00093500
6019 dh_params ? MHD_OPTION_HTTPS_MEM_DHPARAMS : MHD_OPTION_END,
6032 gsad_address_set_port (
struct sockaddr_storage *address,
int port)
6034 struct sockaddr_in *gsad_address = (
struct sockaddr_in *) address;
6035 struct sockaddr_in6 *gsad_address6 = (
struct sockaddr_in6 *) address;
6037 gsad_address->sin_port = htons (port);
6038 gsad_address6->sin6_port = htons (port);
6052 gsad_address_init (
const char *address_str,
int port)
6054 struct sockaddr_storage *address = g_malloc0 (
sizeof (*address));
6055 struct sockaddr_in *gsad_address = (
struct sockaddr_in *) address;
6056 struct sockaddr_in6 *gsad_address6 = (
struct sockaddr_in6 *) address;
6058 gsad_address_set_port (address, port);
6061 if (inet_pton (AF_INET6, address_str, &gsad_address6->sin6_addr) > 0)
6062 address->ss_family = AF_INET6;
6063 else if (inet_pton (AF_INET, address_str, &gsad_address->sin_addr) > 0)
6064 address->ss_family = AF_INET;
6067 g_warning (
"Failed to create GSAD address %s", address_str);
6075 gsad_address->sin_addr.s_addr = INADDR_ANY;
6076 gsad_address6->sin6_addr = in6addr_any;
6077 if (ipv6_is_enabled ())
6078 address->ss_family = AF_INET6;
6080 address->ss_family = AF_INET;
6095 main (
int argc,
char **argv)
6103 sigset_t sigmask_all, sigmask_current;
6107 if (gsad_init () == MHD_NO)
6109 g_critical (
"%s: Initialization failed!\nExiting...\n", __FUNCTION__);
6110 exit (EXIT_FAILURE);
6115 static gboolean do_chroot = FALSE;
6116 static gchar *drop = NULL;
6117 static gboolean foreground = FALSE;
6118 static gboolean http_only = FALSE;
6119 static gboolean print_version = FALSE;
6120 static gboolean no_redirect = FALSE;
6121 static gboolean secure_cookie = FALSE;
6123 static gchar **gsad_address_string = NULL;
6124 static gchar **gsad_header_host_strings = NULL;
6125 static gchar *gsad_manager_address_string = NULL;
6126 static gchar *gsad_manager_unix_socket_path = NULL;
6127 static gchar *gsad_port_string = NULL;
6128 static gchar *gsad_redirect_port_string = NULL;
6129 static gchar *gsad_manager_port_string = NULL;
6130 static gchar *gsad_vendor_version_string = NULL;
6131 static gchar *gsad_login_label_name = NULL;
6132 static gchar *ssl_private_key_filename = OPENVAS_SERVER_KEY;
6133 static gchar *ssl_certificate_filename = OPENVAS_SERVER_CERTIFICATE;
6134 static gchar *dh_params_filename = NULL;
6135 static gchar *unix_socket_path = NULL;
6136 static gchar *gnutls_priorities =
"NORMAL";
6137 static int debug_tls = 0;
6138 static gchar *face_name = NULL;
6139 static gchar *guest_user = NULL;
6140 static gchar *guest_pass = NULL;
6143 static gchar *http_guest_chart_frame_opts
6145 static gchar *http_guest_chart_csp
6147 static int hsts_enabled = FALSE;
6149 static gboolean ignore_x_real_ip = FALSE;
6150 static int verbose = 0;
6151 GError *error = NULL;
6152 GOptionContext *option_context;
6153 static GOptionEntry option_entries[] = {
6154 {
"allow-header-host",
'\0',
6155 0, G_OPTION_ARG_STRING_ARRAY, &gsad_header_host_strings,
6156 "Allow <host> as hostname/address part of a Host header." 6158 {
"drop-privileges",
'\0',
6159 0, G_OPTION_ARG_STRING, &drop,
6160 "Drop privileges to <user>.",
"<user>" },
6162 0, G_OPTION_ARG_NONE, &foreground,
6163 "Run in foreground.", NULL},
6165 0, G_OPTION_ARG_NONE, &http_only,
6166 "Serve HTTP only, without SSL.", NULL},
6169 0, G_OPTION_ARG_STRING_ARRAY, &gsad_address_string,
6170 "Listen on <address>.",
"<address>" },
6172 0, G_OPTION_ARG_STRING, &gsad_manager_address_string,
6173 "Manager address.",
"<address>" },
6175 0, G_OPTION_ARG_STRING, &gsad_port_string,
6176 "Use port number <number>.",
"<number>"},
6178 0, G_OPTION_ARG_STRING, &gsad_manager_port_string,
6179 "Use manager port number <number>.",
"<number>"},
6181 0, G_OPTION_ARG_STRING, &gsad_redirect_port_string,
6182 "Redirect HTTP from this port number <number>.",
"<number>"},
6183 {
"no-redirect",
'\0',
6184 0, G_OPTION_ARG_NONE, &no_redirect,
6185 "Don't redirect HTTP to HTTPS.", NULL },
6187 0, G_OPTION_ARG_NONE, &verbose,
6188 "Has no effect. See INSTALL for logging config.", NULL },
6190 0, G_OPTION_ARG_NONE, &print_version,
6191 "Print version and exit.", NULL},
6192 {
"vendor-version",
'\0',
6193 0, G_OPTION_ARG_STRING, &gsad_vendor_version_string,
6194 "Use <string> as version in interface.",
"<string>"},
6195 {
"login-label",
'\0',
6196 0, G_OPTION_ARG_STRING, &gsad_login_label_name,
6197 "Use <string> as login label.",
"<string>"},
6198 {
"ssl-private-key",
'k',
6199 0, G_OPTION_ARG_FILENAME, &ssl_private_key_filename,
6200 "Use <file> as the private key for HTTPS",
"<file>"},
6201 {
"ssl-certificate",
'c',
6202 0, G_OPTION_ARG_FILENAME, &ssl_certificate_filename,
6203 "Use <file> as the certificate for HTTPS",
"<file>"},
6205 0, G_OPTION_ARG_FILENAME, &dh_params_filename,
6206 "Diffie-Hellman parameters file",
"<file>"},
6208 0, G_OPTION_ARG_NONE, &do_chroot,
6209 "Do chroot.", NULL},
6210 {
"secure-cookie",
'\0',
6211 0, G_OPTION_ARG_NONE, &secure_cookie,
6212 "Use a secure cookie (implied when using HTTPS).", NULL},
6214 0, G_OPTION_ARG_INT, &timeout,
6215 "Minutes of user idle time before session expires.",
"<number>"},
6216 {
"client-watch-interval",
'\0',
6218 "Check if client connection was closed every <number> seconds." 6223 0, G_OPTION_ARG_INT, &debug_tls,
6224 "Enable TLS debugging at <level>",
"<level>"},
6225 {
"gnutls-priorities",
'\0',
6226 0, G_OPTION_ARG_STRING, &gnutls_priorities,
6227 "GnuTLS priorities string.",
"<string>"},
6229 0, G_OPTION_ARG_STRING, &face_name,
6230 "Use interface files from subdirectory <dir>",
"<dir>"},
6231 {
"guest-username", 0,
6232 0, G_OPTION_ARG_STRING, &guest_user,
6233 "Username for guest user. Enables guest logins.",
"<name>"},
6234 {
"guest-password", 0,
6235 0, G_OPTION_ARG_STRING, &guest_pass,
6236 "Password for guest user. Defaults to guest username.",
"<password>"},
6237 {
"http-frame-opts", 0,
6238 0, G_OPTION_ARG_STRING, &http_frame_opts,
6239 "X-Frame-Options HTTP header. Defaults to \"" 6242 0, G_OPTION_ARG_STRING, &http_csp,
6243 "Content-Security-Policy HTTP header. Defaults to \"" 6245 {
"http-guest-chart-frame-opts", 0,
6246 0, G_OPTION_ARG_STRING, &http_guest_chart_frame_opts,
6247 "X-Frame-Options HTTP header for guest charts. Defaults to \"" 6249 {
"http-guest-chart-csp", 0,
6250 0, G_OPTION_ARG_STRING, &http_guest_chart_csp,
6251 "Content-Security-Policy HTTP header. Defaults to \"" 6254 0, G_OPTION_ARG_NONE, &hsts_enabled,
6255 "Enable HTTP Strict-Tranport-Security header.", NULL},
6256 {
"http-sts-max-age", 0,
6257 0, G_OPTION_ARG_INT, &hsts_max_age,
6258 "max-age in seconds for HTTP Strict-Tranport-Security header." 6261 {
"ignore-x-real-ip",
'\0',
6262 0, G_OPTION_ARG_NONE, &ignore_x_real_ip,
6263 "Do not use X-Real-IP to determine the client address.", NULL},
6264 {
"unix-socket",
'\0',
6265 0, G_OPTION_ARG_FILENAME, &unix_socket_path,
6266 "Path to unix socket to listen on",
"<file>"},
6267 {
"munix-socket",
'\0',
6268 0, G_OPTION_ARG_FILENAME, &gsad_manager_unix_socket_path,
6269 "Path to Manager unix socket",
"<file>"},
6274 g_option_context_new (
"- Greenbone Security Assistant Daemon");
6275 g_option_context_add_main_entries (option_context, option_entries, NULL);
6276 if (!g_option_context_parse (option_context, &argc, &argv, &error))
6278 g_critical (
"%s: %s\n\n", __FUNCTION__, error->message);
6279 exit (EXIT_FAILURE);
6281 g_option_context_free (option_context);
6290 if (http_only == FALSE && hsts_enabled)
6293 = g_strdup_printf (
"max-age=%d",
6294 hsts_max_age >= 0 ? hsts_max_age
6302 if (register_signal_handlers ())
6304 g_critical (
"Failed to register signal handlers!\n");
6305 exit (EXIT_FAILURE);
6310 printf (
"Greenbone Security Assistant %s\n", GSAD_VERSION);
6311 #ifdef GSAD_GIT_REVISION 6312 printf (
"GIT revision %s\n", GSAD_GIT_REVISION);
6316 printf (
"gnutls %s\n", gnutls_check_version (NULL));
6317 printf (
"libmicrohttpd %s\n", MHD_get_version ());
6319 printf (
"Copyright (C) 2010-2016 Greenbone Networks GmbH\n");
6320 printf (
"License GPLv2+: GNU GPL version 2 or later\n");
6322 (
"This is free software: you are free to change and redistribute it.\n" 6323 "There is NO WARRANTY, to the extent permitted by law.\n\n");
6324 exit (EXIT_SUCCESS);
6329 gnutls_global_set_log_function (my_gnutls_log_func);
6330 gnutls_global_set_log_level (debug_tls);
6336 g_critical (
"%s: libxml must be compiled with thread support\n",
6338 exit (EXIT_FAILURE);
6341 if (gsad_vendor_version_string)
6344 if (gsad_login_label_name)
6348 g_critical (
"Invalid character in login label name\n");
6349 exit (EXIT_FAILURE);
6353 if (no_redirect && gsad_redirect_port_string)
6355 g_warning (
"--no-redirect option given with --rport");
6361 if (setenv (
"TZ",
"utc 0", 1) == -1)
6363 g_critical (
"%s: failed to set timezone\n", __FUNCTION__);
6364 exit (EXIT_FAILURE);
6370 rc_name = g_build_filename (GSA_CONFIG_DIR,
"gsad_log.conf", NULL);
6371 if (g_file_test (rc_name, G_FILE_TEST_EXISTS))
6372 log_config = load_log_configuration (rc_name);
6379 #ifdef GSAD_GIT_REVISION 6380 g_message (
"Starting GSAD version %s (GIT revision %s)\n",
6384 g_message (
"Starting GSAD version %s\n",
6392 if ((timeout < 1) || (timeout > 1440))
6394 g_critical (
"%s: Timeout must be a number from 1 to 1440\n",
6396 exit (EXIT_FAILURE);
6413 if (gsad_port_string)
6415 gsad_port = atoi (gsad_port_string);
6416 if (gsad_port <= 0 || gsad_port >= 65536)
6418 g_critical (
"%s: Port must be a number between 0 and 65536\n",
6420 exit (EXIT_FAILURE);
6424 if (gsad_manager_port_string)
6426 gsad_manager_port = atoi (gsad_manager_port_string);
6427 if (gsad_manager_port <= 0 || gsad_manager_port >= 65536)
6429 g_critical (
"%s: Manager port must be a number between 0 and 65536\n",
6431 exit (EXIT_FAILURE);
6436 old_locale = g_strdup (setlocale (LC_ALL, NULL));
6438 locale = setlocale (LC_ALL,
"");
6442 "Failed to set locale according to environment variables," 6443 " gettext translations are disabled.",
6447 else if (strcmp (locale,
"C") == 0)
6449 g_message (
"%s: Locale for gettext extensions set to \"C\"," 6450 " gettext translations are disabled.",
6456 if (strcasestr (locale,
"en_") != locale)
6458 g_warning (
"%s: Locale defined by environment variables" 6459 " is not an \"en_...\" one.",
6464 if (strcasecmp (nl_langinfo (CODESET),
"UTF-8"))
6465 g_warning (
"%s: Locale defined by environment variables" 6466 " does not use UTF-8 encoding.",
6469 g_debug (
"%s: gettext translation extensions are enabled" 6470 " (using locale \"%s\").",
6471 __FUNCTION__, locale);
6475 setlocale (LC_ALL, old_locale);
6476 g_free (old_locale);
6480 if (gsad_redirect_port_string)
6482 gsad_redirect_port = atoi (gsad_redirect_port_string);
6483 if (gsad_redirect_port <= 0 || gsad_redirect_port >= 65536)
6485 g_critical (
"%s: Redirect port must be a number between 0 and 65536\n",
6487 exit (EXIT_FAILURE);
6491 if (foreground == FALSE)
6494 g_debug (
"Forking...\n");
6495 pid_t pid = fork ();
6503 g_critical (
"%s: Failed to fork!\n", __FUNCTION__);
6504 exit (EXIT_FAILURE);
6508 exit (EXIT_SUCCESS);
6516 if (unix_socket_path)
6519 g_debug (
"Forking for unix socket...\n");
6520 pid_t pid = fork ();
6526 if (prctl (PR_SET_PDEATHSIG, SIGKILL))
6527 g_warning (
"%s: Failed to change parent death signal;" 6528 " unix socket process will remain if parent is killed:" 6536 g_warning (
"%s: Failed to fork for unix socket!\n", __FUNCTION__);
6537 exit (EXIT_FAILURE);
6550 g_debug (
"Forking for redirect...\n");
6551 pid_t pid = fork ();
6557 if (prctl (PR_SET_PDEATHSIG, SIGKILL))
6558 g_warning (
"%s: Failed to change parent death signal;" 6559 " redirect process will remain if parent is killed:" 6569 g_critical (
"%s: Failed to fork for redirect!\n", __FUNCTION__);
6570 exit (EXIT_FAILURE);
6582 if (atexit (&gsad_cleanup))
6584 g_critical (
"%s: Failed to register cleanup function!\n", __FUNCTION__);
6585 exit (EXIT_FAILURE);
6590 if (pidfile_create (
"gsad"))
6592 g_critical (
"%s: Could not write PID file.\n", __FUNCTION__);
6593 exit (EXIT_FAILURE);
6600 if (gsad_address_string)
6605 while (*gsad_address_string)
6607 if (gsad_address_init (*gsad_address_string, gsad_port))
6609 gsad_address_string++;
6617 if (gsad_address_init (NULL, gsad_port))
6621 if (gsad_header_host_strings)
6622 while (*gsad_header_host_strings)
6625 g_strdup (*gsad_header_host_strings));
6626 gsad_header_host_strings ++;
6629 g_debug (
"Accepting %d host addresses in Host headers",
6633 GHashTableIter iter;
6636 while (g_hash_table_iter_next (&iter, (
void**)(&hostname), NULL))
6638 g_debug (
"- %s\n", hostname);
6649 gsad_address_set_port (list->data, gsad_redirect_port);
6650 gsad_daemon = start_http_daemon (gsad_redirect_port, redirect_handler,
6657 g_warning (
"%s: start_http_daemon redirect failed !", __FUNCTION__);
6658 return EXIT_FAILURE;
6662 g_debug (
"GSAD started successfully and is redirecting on port %d.\n",
6663 gsad_redirect_port);
6666 else if (unix_socket_path && !
unix_pid)
6670 omp_init (gsad_manager_unix_socket_path,
6671 gsad_manager_address_string,
6674 gsad_daemon = start_unix_http_daemon (unix_socket_path, handle_request);
6678 g_warning (
"%s: start_unix_http_daemon failed !", __FUNCTION__);
6679 return EXIT_FAILURE;
6683 g_debug (
"GSAD started successfully and is listening on unix" 6692 omp_init (gsad_manager_unix_socket_path,
6693 gsad_manager_address_string,
6702 gsad_daemon = start_http_daemon (gsad_port, handle_request,
6704 if (
gsad_daemon == NULL && gsad_port_string == NULL)
6706 g_warning (
"Binding to port %d failed, trying default port" 6709 gsad_address_set_port (list->data, gsad_port);
6710 gsad_daemon = start_http_daemon (gsad_port, handle_request,
6718 gchar *ssl_private_key = NULL;
6719 gchar *ssl_certificate = NULL;
6720 gchar *dh_params = NULL;
6725 if (!g_file_get_contents (ssl_private_key_filename, &ssl_private_key,
6728 g_critical (
"%s: Could not load private SSL key from %s: %s\n",
6730 ssl_private_key_filename,
6732 g_error_free (error);
6733 exit (EXIT_FAILURE);
6736 if (!g_file_get_contents (ssl_certificate_filename, &ssl_certificate,
6739 g_critical (
"%s: Could not load SSL certificate from %s: %s\n",
6741 ssl_certificate_filename,
6743 g_error_free (error);
6744 exit (EXIT_FAILURE);
6747 if (dh_params_filename &&
6748 !g_file_get_contents (dh_params_filename, &dh_params, NULL,
6751 g_critical (
"%s: Could not load SSL certificate from %s: %s\n",
6752 __FUNCTION__, dh_params_filename, error->message);
6753 g_error_free (error);
6754 exit (EXIT_FAILURE);
6760 (gsad_port, ssl_private_key, ssl_certificate,
6761 gnutls_priorities, dh_params, list->data);
6762 if (
gsad_daemon == NULL && gsad_port_string == NULL)
6764 g_warning (
"Binding to port %d failed, trying default port" 6767 gsad_address_set_port (list->data, gsad_port);
6769 (gsad_port, ssl_private_key, ssl_certificate,
6770 gnutls_priorities, dh_params, list->data);
6778 g_critical (
"%s: start_https_daemon failed!\n", __FUNCTION__);
6779 return EXIT_FAILURE;
6783 g_debug (
"GSAD started successfully and is listening on port %d.\n",
6790 if (chroot_drop_privileges (do_chroot, drop,
6795 g_critical (
"%s: Cannot use custom face \"%s\".\n",
6796 __FUNCTION__, face_name);
6797 exit (EXIT_FAILURE);
6801 g_critical (
"%s: Cannot use default face \"%s\"!\n",
6803 exit (EXIT_FAILURE);
6810 if (sigfillset (&sigmask_all))
6812 g_critical (
"%s: Error filling signal set\n", __FUNCTION__);
6813 exit (EXIT_FAILURE);
6815 if (pthread_sigmask (SIG_BLOCK, &sigmask_all, &sigmask_current))
6817 g_critical (
"%s: Error setting signal mask\n", __FUNCTION__);
6818 exit (EXIT_FAILURE);
6831 if (pselect (0, NULL, NULL, NULL, NULL, &sigmask_current) == -1)
6835 g_critical (
"%s: pselect: %s\n", __FUNCTION__, strerror (errno));
6836 exit (EXIT_FAILURE);
6839 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.