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"
85 if (!xmlHasFeature (XML_WITH_THREAD))
102 xsltCleanupGlobals ();
174 if (!g_regex_match_simple (
"^[a-zA-Z0-9\\-_\\.\\:]+$", name, 0, 0))
193 if (language == NULL || strcmp (language,
"Browser Language") == 0)
195 else if (strcmp (language,
"Chinese") == 0)
196 *lang = g_strdup (
"zh_CN");
197 else if (strcmp (language,
"English") == 0)
198 *lang = g_strdup (
"en");
199 else if (strcmp (language,
"German") == 0)
200 *lang = g_strdup (
"de");
202 *lang = g_strdup (language);
218 tm = localtime (time);
220 || (strftime (
string,
238 "An internal server error has occurred during XSL transformation." \
255 const char *xsl_stylesheet,
259 xsltStylesheetPtr cur = NULL;
261 xmlChar *doc_txt_ptr = NULL;
264 g_debug (
"xsl stylesheet: [%s]\n", xml_text);
265 g_debug (
"text to transform: [%s]\n", xml_text);
270 xmlSubstituteEntitiesDefault (1);
271 xmlLoadExtDtdDefaultValue = 1;
272 cur = xsltParseStylesheetFile ((
const xmlChar *) xsl_stylesheet);
275 g_warning (
"Failed to parse stylesheet %s", xsl_stylesheet);
281 doc = xmlParseMemory (xml_text, strlen (xml_text));
284 g_warning (
"Failed to parse stylesheet %s", xsl_stylesheet);
285 xsltFreeStylesheet (cur);
291 res = xsltApplyStylesheet (cur, doc, NULL);
294 g_warning (
"Failed to apply stylesheet %s", xsl_stylesheet);
295 xsltFreeStylesheet (cur);
303 if (xsltSaveResultToString (&doc_txt_ptr, &doc_txt_len, res, cur) < 0)
305 g_warning (
"Failed to store transformation result.");
306 xsltFreeStylesheet (cur);
313 xsltFreeStylesheet (cur);
317 return (
char *) doc_txt_ptr;
322 gboolean success = TRUE;
323 gchar *standard_out = NULL;
324 gchar *standard_err = NULL;
325 char content_file[] =
"/tmp/gsa_xsl_transform_XXXXXX";
330 content_fd = mkstemp (content_file);
331 if (content_fd == -1)
333 g_warning (
"%s: mkstemp: %s\n", __FUNCTION__, strerror (errno));
339 g_debug (
"text to transform: [%s]\n", xml_text);
342 g_file_set_contents (content_file, xml_text, strlen (xml_text), &error);
345 g_warning (
"%s", error->message);
346 g_error_free (error);
347 unlink (content_file);
354 cmd = (gchar **) g_malloc (4 *
sizeof (gchar *));
355 cmd[0] = g_strdup (
"xsltproc");
356 cmd[1] = g_strdup (xsl_stylesheet);
357 cmd[2] = g_strdup (content_file);
359 g_debug (
"%s: Spawning in parent dir: %s %s %s\n",
360 __FUNCTION__, cmd[0], cmd[1], cmd[2]);
361 if ((g_spawn_sync (NULL,
372 || (WIFEXITED (exit_status) == 0)
373 || WEXITSTATUS (exit_status))
375 g_debug (
"%s: failed to transform the xml: %d (WIF %i, WEX %i)",
378 WIFEXITED (exit_status),
379 WEXITSTATUS (exit_status));
380 g_debug (
"%s: stderr: %s\n", __FUNCTION__, standard_err);
381 g_debug (
"%s: stdout: %s\n", __FUNCTION__, standard_out);
391 g_free (standard_err);
393 unlink (content_file);
399 g_free (standard_out);
441 const char *
function,
int line,
const char *msg,
444 gchar *xml, *message, *resp;
445 const char* xml_flag;
447 if (credentials && credentials->
params)
454 message = g_strdup_printf (
"<gsad_response>"
455 "<title>%s: %s:%i (GSA %s)</title>"
456 "<message>%s</message>"
457 "<backurl>%s</backurl>"
465 backurl ? backurl :
"/omp?cmd=get_tasks",
466 credentials ? credentials->
token :
"");
470 message = g_strdup_printf (
"<gsad_response>"
471 "<title>%s (GSA %s)</title>"
472 "<message>%s</message>"
473 "<backurl>%s</backurl>"
479 backurl ? backurl :
"/omp?cmd=get_tasks",
480 credentials ? credentials->
token :
"");
492 pre = g_markup_printf_escaped
494 "<version>%s</version>"
495 "<vendor_version>%s</vendor_version>"
501 "<charts>%i</charts>"
502 "<client_address>%s</client_address>",
512 xml = g_strdup_printf (
"%s%s"
513 "<capabilities>%s</capabilities>"
522 xml = g_strdup (message);
526 if (xml_flag && strcmp (xml_flag,
"0"))
532 resp = g_strdup (
"<html>"
534 "An internal server error has occurred during XSL"
557 login_xml (
const gchar *message,
const gchar *token,
const gchar *time,
558 const gchar *url,
const gchar *i18n,
const gchar *guest)
563 xml = g_string_new (
"");
564 xml_string_append (xml,
566 "<version>%s</version>"
567 "<vendor_version>%s</vendor_version>"
576 xml_string_append(xml,
580 xml_string_append (xml,
581 "<message>%s</message>",
584 xml_string_append (xml,
588 xml_string_append (xml,
592 xml_string_append (xml,
593 "<guest><username>%s</username></guest>",
595 g_string_append (xml,
"</login_page>");
597 return g_string_free (xml, FALSE);
609 param_free (gpointer
param)
611 g_free (((
param_t*) param)->value);
612 g_free (((
param_t*) param)->original_value);
613 g_free (((
param_t*) param)->filename);
626 return g_hash_table_new_full (g_str_hash, g_str_equal, g_free, param_free);
638 g_hash_table_destroy (params);
653 param = g_hash_table_lookup (params, name);
669 param = g_hash_table_lookup (params, name);
670 return param ? 1 : 0;
685 param = g_hash_table_lookup (params, name);
686 return param ? param->
value : NULL;
701 param = g_hash_table_lookup (params, name);
719 param = g_hash_table_lookup (params, name);
735 param = g_hash_table_lookup (params, name);
736 return param ? param->
filename : NULL;
751 param = g_hash_table_lookup (params, name);
752 return param ? param->
values : NULL;
767 param = g_hash_table_lookup (params, name);
768 return param ? param->
valid : 0;
788 param = g_malloc0 (
sizeof (
param_t));
791 param->
value = g_strdup (value);
794 g_hash_table_insert (params, g_strdup (name), param);
813 int chunk_size,
int chunk_offset)
824 value = g_malloc0 (chunk_size + 1);
825 memcpy (value + chunk_offset, chunk_data, chunk_size);
828 g_free (param->
value);
829 param->
value = value;
834 new_value = realloc (param->
value,
836 if (new_value == NULL)
838 param->
value = new_value;
839 memcpy (param->
value + chunk_offset,
842 param->
value[chunk_offset + chunk_size] =
'\0';
861 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.
Structure of credential related information.
const char * params_original_value(params_t *params, const char *name)
Get original value of param, before validation.
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.