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