]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add urlquote xlat - useful for LDAP DNs with comma, backslash 90/head
authorPhil Mayers <p.mayers@imperial.ac.uk>
Wed, 19 Sep 2012 16:21:06 +0000 (17:21 +0100)
committerPhil Mayers <p.mayers@imperial.ac.uk>
Wed, 19 Sep 2012 16:21:06 +0000 (17:21 +0100)
src/main/xlat.c

index b8079a50026348ccb3c20841387d15f279ce1728..1c8c9a5ec58f3dcc6296b0e40ca1048a4cbd0c33 100644 (file)
@@ -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
                /*