Skip to content

Commit

Permalink
Add tojson xlat for escaping json strings
Browse files Browse the repository at this point in the history
  • Loading branch information
arr2036 committed Jan 16, 2015
1 parent e90c8cf commit 7611ede
Showing 1 changed file with 70 additions and 0 deletions.
70 changes: 70 additions & 0 deletions src/modules/rlm_rest/rlm_rest.c
Expand Up @@ -129,6 +129,75 @@ static void rlm_rest_cleanup(rlm_rest_t *instance, rlm_rest_section_t *section,
rest_request_cleanup(instance, section, handle);
}

static ssize_t json_escape_xlat(UNUSED void *instance, UNUSED REQUEST *request,
char const *fmt, char *out, size_t outlen)
{
char const *p;
size_t freespace = outlen;
size_t len;

for (p = fmt; *p != '\0'; p++) {
/* Indicate truncation */
if (freespace < 3) return outlen + 1;

if (*p == '"') {
*out++ = '\\';
*out++ = '"';
freespace -= 2;
} else if (*p == '\\') {
*out++ = '\\';
*out++ = '\\';
freespace -= 2;
} else if (*p == '/') {
*out++ = '\\';
*out++ = '/';
freespace -= 2;
} else if (*p >= ' ') {
*out++ = *p;
freespace--;
/*
* Unprintable chars
*/
} else {
*out++ = '\\';
freespace--;

switch (*p) {
case '\b':
*out++ = 'b';
freespace--;
break;

case '\f':
*out++ = 'f';
freespace--;
break;

case '\n':
*out++ = 'b';
freespace--;
break;

case '\r':
*out++ = 'r';
freespace--;
break;

case '\t':
*out++ = 't';
freespace--;
break;
default:
len = snprintf(out, freespace, "u%04X", *p);
if (is_truncated(len, freespace)) return (outlen - freespace) + len;
out += len;
freespace -= len;
}
}
}

return outlen - freespace;
}
/*
* Simple xlat to read text data from a URL
*/
Expand Down Expand Up @@ -732,6 +801,7 @@ static int mod_instantiate(CONF_SECTION *conf, void *instance)
* Register the rest xlat function
*/
xlat_register(inst->xlat_name, rest_xlat, rest_uri_escape, inst);
xlat_register("tojson", json_escape_xlat, NULL, inst);

/*
* Parse sub-section configs.
Expand Down

0 comments on commit 7611ede

Please sign in to comment.