From 97519c9323f48f54905f76e8a356eb9a89636a25 Mon Sep 17 00:00:00 2001 From: Phil Mayers Date: Wed, 19 Sep 2012 17:21:06 +0100 Subject: [PATCH] add urlquote xlat - useful for LDAP DNs with comma, backslash --- src/main/xlat.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/main/xlat.c b/src/main/xlat.c index b8079a50026..1c8c9a5ec58 100644 --- a/src/main/xlat.c +++ b/src/main/xlat.c @@ -759,6 +759,52 @@ static size_t xlat_lc(UNUSED void *instance, REQUEST *request, return strlen(out); } +static size_t xlat_urlquote(UNUSED void *instance, REQUEST *request, + const char *fmt, char *out, size_t outlen, + UNUSED RADIUS_ESCAPE_STRING func) +{ + char *in, *o; + char buffer[1024]; + + if (outlen <= 1) return 0; + + if (!radius_xlat(buffer, sizeof(buffer), fmt, request, func)) { + *out = '\0'; + return 0; + } + + in = buffer; + o = out; + + while (*in && outlen > 1) { + if (isalnum(*in)) { + *o++ = *in++; + outlen--; + continue; + } + + switch (*in) { + case '-': + case '_': + case '.': + case '~': + *o++ = *in++; + outlen--; + break; + default: + if (outlen <= 3) + break; + snprintf(o, 4, "%%%02x", *in++); + outlen -= 3; + o += 3; + } + } + + *o = '\0'; + + return strlen(out); +} + /** * @brief Convert a string to uppercase @@ -893,6 +939,7 @@ int xlat_register(const char *module, RAD_XLAT_FUNC func, void *instance) XLAT_REGISTER(hex); XLAT_REGISTER(string); XLAT_REGISTER(module); + XLAT_REGISTER(urlquote); #ifdef HAVE_REGEX_H /* -- 2.47.3