35 #define XSL_PATH "gsad.xsl" 39 #include <openvas/omp/xml.h> 42 #include <microhttpd.h> 45 #include <libxml/parser.h> 46 #include <libexslt/exslt.h> 48 #include <libxslt/xsltInternals.h> 49 #include <libxslt/transform.h> 50 #include <libxslt/xsltutils.h> 62 #define G_LOG_DOMAIN "gsad base" 79 static int http_only = 0;
90 if (!xmlHasFeature (XML_WITH_THREAD))
107 xsltCleanupGlobals ();
201 if (!g_regex_match_simple (
"^[a-zA-Z0-9\\-_\\.\\:]+$", name, 0, 0))
220 if (language == NULL || strcmp (language,
"Browser Language") == 0)
222 else if (strcmp (language,
"Chinese") == 0)
223 *lang = g_strdup (
"zh_CN");
224 else if (strcmp (language,
"English") == 0)
225 *lang = g_strdup (
"en");
226 else if (strcmp (language,
"German") == 0)
227 *lang = g_strdup (
"de");
229 *lang = g_strdup (language);
245 tm = localtime (time);
247 || (strftime (
string,
265 "An internal server error has occurred during XSL transformation." \ 282 const char *xsl_stylesheet,
286 xsltStylesheetPtr cur = NULL;
288 xmlChar *doc_txt_ptr = NULL;
291 g_debug (
"xsl stylesheet: [%s]\n", xml_text);
292 g_debug (
"text to transform: [%s]\n", xml_text);
297 xmlSubstituteEntitiesDefault (1);
298 xmlLoadExtDtdDefaultValue = 1;
299 cur = xsltParseStylesheetFile ((
const xmlChar *) xsl_stylesheet);
302 g_warning (
"Failed to parse stylesheet %s", xsl_stylesheet);
308 doc = xmlParseMemory (xml_text, strlen (xml_text));
311 g_warning (
"Failed to parse stylesheet %s", xsl_stylesheet);
312 xsltFreeStylesheet (cur);
318 res = xsltApplyStylesheet (cur, doc, NULL);
321 g_warning (
"Failed to apply stylesheet %s", xsl_stylesheet);
322 xsltFreeStylesheet (cur);
330 if (xsltSaveResultToString (&doc_txt_ptr, &doc_txt_len, res, cur) < 0)
332 g_warning (
"Failed to store transformation result.");
333 xsltFreeStylesheet (cur);
340 xsltFreeStylesheet (cur);
344 return (
char *) doc_txt_ptr;
349 gboolean success = TRUE;
350 gchar *standard_out = NULL;
351 gchar *standard_err = NULL;
352 char content_file[] =
"/tmp/gsa_xsl_transform_XXXXXX";
357 content_fd = mkstemp (content_file);
358 if (content_fd == -1)
360 g_warning (
"%s: mkstemp: %s\n", __FUNCTION__, strerror (errno));
366 g_debug (
"text to transform: [%s]\n", xml_text);
369 g_file_set_contents (content_file, xml_text, strlen (xml_text), &error);
372 g_warning (
"%s", error->message);
373 g_error_free (error);
374 unlink (content_file);
381 cmd = (gchar **) g_malloc (4 *
sizeof (gchar *));
382 cmd[0] = g_strdup (
"xsltproc");
383 cmd[1] = g_strdup (xsl_stylesheet);
384 cmd[2] = g_strdup (content_file);
386 g_debug (
"%s: Spawning in parent dir: %s %s %s\n",
387 __FUNCTION__, cmd[0], cmd[1], cmd[2]);
388 if ((g_spawn_sync (NULL,
399 || (WIFEXITED (exit_status) == 0)
400 || WEXITSTATUS (exit_status))
402 g_debug (
"%s: failed to transform the xml: %d (WIF %i, WEX %i)",
405 WIFEXITED (exit_status),
406 WEXITSTATUS (exit_status));
407 g_debug (
"%s: stderr: %s\n", __FUNCTION__, standard_err);
408 g_debug (
"%s: stdout: %s\n", __FUNCTION__, standard_out);
418 g_free (standard_err);
420 unlink (content_file);
426 g_free (standard_out);
468 const char *
function,
int line,
const char *msg,
471 gchar *xml, *message, *resp;
472 const char* xml_flag;
474 if (credentials && credentials->
params)
481 message = g_strdup_printf (
"<gsad_response>" 482 "<title>%s: %s:%i (GSA %s)</title>" 483 "<message>%s</message>" 484 "<backurl>%s</backurl>" 492 backurl ? backurl :
"/omp?cmd=get_tasks",
493 credentials ? credentials->
token :
"");
497 message = g_strdup_printf (
"<gsad_response>" 498 "<title>%s (GSA %s)</title>" 499 "<message>%s</message>" 500 "<backurl>%s</backurl>" 506 backurl ? backurl :
"/omp?cmd=get_tasks",
507 credentials ? credentials->
token :
"");
519 pre = g_markup_printf_escaped
521 "<version>%s</version>" 522 "<vendor_version>%s</vendor_version>" 528 "<charts>%i</charts>" 529 "<client_address>%s</client_address>",
539 xml = g_strdup_printf (
"%s%s" 540 "<capabilities>%s</capabilities>" 549 xml = g_strdup (message);
553 if (xml_flag && strcmp (xml_flag,
"0"))
559 resp = g_strdup (
"<html>" 561 "An internal server error has occurred during XSL" 584 login_xml (
const gchar *message,
const gchar *token,
const gchar *time,
585 const gchar *url,
const gchar *i18n,
const gchar *guest)
590 xml = g_string_new (
"");
591 xml_string_append (xml,
593 "<version>%s</version>" 594 "<vendor_version>%s</vendor_version>" 596 "<http_only>%d</http_only>" 605 xml_string_append(xml,
609 xml_string_append (xml,
610 "<message>%s</message>",
613 xml_string_append (xml,
617 xml_string_append (xml,
621 xml_string_append (xml,
622 "<guest><username>%s</username></guest>",
624 g_string_append (xml,
"</login_page>");
626 return g_string_free (xml, FALSE);
638 param_free (gpointer
param)
655 return g_hash_table_new_full (g_str_hash, g_str_equal, g_free, param_free);
667 g_hash_table_destroy (params);
682 param = g_hash_table_lookup (params, name);
698 param = g_hash_table_lookup (params, name);
699 return param ? 1 : 0;
714 param = g_hash_table_lookup (params, name);
730 param = g_hash_table_lookup (params, name);
748 param = g_hash_table_lookup (params, name);
764 param = g_hash_table_lookup (params, name);
780 param = g_hash_table_lookup (params, name);
796 param = g_hash_table_lookup (params, name);
823 g_hash_table_insert (params, g_strdup (name),
param);
842 int chunk_size,
int chunk_offset)
853 value = g_malloc0 (chunk_size + 1);
854 memcpy (value + chunk_offset, chunk_data, chunk_size);
865 if (new_value == NULL)
871 param->
value[chunk_offset + chunk_size] =
'\0';
890 return g_hash_table_iter_next (iterator, (gpointer*) name, (gpointer*)
param);
int params_value_size(params_t *params, const char *name)
Get the size of the value of param.
params_t * params_values(params_t *params, const char *name)
Get values of param.
int gsad_base_cleanup()
Base init.
char * capabilities
Capabilites of manager.
param_t * params_get(params_t *params, const char *name)
Get param.
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.
int params_given(params_t *params, const char *name)
Get whether a param was given at all.
Response information for commands.
#define FAIL_HTML
HTML returned when XSL transform fails.
const char * params_filename(params_t *params, const char *name)
Get filename of param.
void params_free(params_t *params)
Make a params.
void set_chroot_state(int state)
Sets the chroot state.
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.
Structure of credential related information.
const char * params_original_value(params_t *params, const char *name)
Get original value of param, before validation.
int get_http_only()
Gets the http_only state.
char * username
Name of user.
void register_i18n_ext_module()
Register the i18n XSLT extension module.
char * client_address
Client's address.
Headers/structs used generally in GSA.
void vendor_version_set(const gchar *version)
Set the vendor version.
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.
char * xsl_transform_with_stylesheet(const char *xml_text, const char *xsl_stylesheet, cmd_response_data_t *response_data)
XSL Transformation.
params_t * params_new()
Make a params.
int chroot_state
Whether chroot is used.
int gsad_base_init()
Base init.
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.
char * token
Session token.
const char * params_value(params_t *params, const char *name)
Get value of param.
gboolean params_iterator_next(params_iterator_t *iterator, char **name, param_t **param)
Increment a params iterator.
#define XSL_PATH
Location of XSL file.
const gchar * vendor_version_get()
Get the vendor version.
int charts
Whether to show charts for this user.
char * xsl_transform(const char *xml_text, cmd_response_data_t *response_data)
XSL Transformation.
int get_chroot_state()
Gets the chroot state.
char * language
Accept-Language browser header.
gchar * vendor_version
Version from vendor, or NULL.
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.
#define params_iterator_t
int label_name_set(const gchar *name)
Set the login label.
param_t * params_add(params_t *params, const char *name, const char *value)
Add a param.
const gchar * label_name_get()
Get the login label name.
int params_valid(params_t *params, const char *name)
Get whether a param is valid.