diff options
| -rw-r--r-- | lasso/xml/private.h | 2 | ||||
| -rw-r--r-- | lasso/xml/tools.c | 30 |
2 files changed, 32 insertions, 0 deletions
diff --git a/lasso/xml/private.h b/lasso/xml/private.h index fe3da380..b13315e3 100644 --- a/lasso/xml/private.h +++ b/lasso/xml/private.h @@ -210,6 +210,8 @@ static inline void message(GLogLevelFlags level, const char *format, ...) if (lasso_provider_get_protocol_conformance(LASSO_PROVIDER(profile->server)) == \ LASSO_PROTOCOL_SAML_2_0) +char * lasso_get_relaystate_from_query(const char *query); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/lasso/xml/tools.c b/lasso/xml/tools.c index 61c51a58..6f9ae73b 100644 --- a/lasso/xml/tools.c +++ b/lasso/xml/tools.c @@ -1464,3 +1464,33 @@ xmlDetectSAX2(xmlParserCtxtPtr ctxt) { ctxt->errNo = XML_ERR_NO_MEMORY; } } + +char * +lasso_get_relaystate_from_query(const char *query) { + char *start, *end; + char *result = NULL; + + if (query == NULL) + return NULL; + start = strstr(query, "?RelayState="); + if (! start) { + start = strstr(query, "&RelayState="); + } + if (start) { + ptrdiff_t length; + + start += sizeof("&RelayState=") - 1; + end = strchr(start, '&'); + if (end) { + length = end-start; + } else { + length = strlen(start); + } + if (length > 240) { + g_warning("Refused to parse a RelayState of size %ti > 240", length); + } else { + result = xmlURIUnescapeString(start, length, NULL); + } + } + return result; +} |
