diff options
| author | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2009-03-27 15:05:39 +0000 |
|---|---|---|
| committer | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2009-03-27 15:05:39 +0000 |
| commit | 96594a8edefd223b69392e361c8d943bb5332f2b (patch) | |
| tree | 78844b85bfd8f3ac62b11eb5a9f8c4c476de971a | |
| parent | d0d71abe2c88af7c4bdd06af447730d51d719b08 (diff) | |
| download | lasso-96594a8edefd223b69392e361c8d943bb5332f2b.tar.gz lasso-96594a8edefd223b69392e361c8d943bb5332f2b.tar.xz lasso-96594a8edefd223b69392e361c8d943bb5332f2b.zip | |
XML: Tool function to extract relaystate from query
* lasso/xml/tools.c, lasso/xml/private.h: new function
lasso_get_relaystate_from_query to help in relaystate handling.
| -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; +} |
