diff options
-rw-r--r-- | libs/web/src/template_lualib.c | 30 | ||||
-rw-r--r-- | libs/web/src/template_parser.c | 8 | ||||
-rw-r--r-- | libs/web/src/template_utils.c | 72 | ||||
-rw-r--r-- | libs/web/src/template_utils.h | 9 |
4 files changed, 99 insertions, 20 deletions
diff --git a/libs/web/src/template_lualib.c b/libs/web/src/template_lualib.c index f40ef2d6a..0d4364104 100644 --- a/libs/web/src/template_lualib.c +++ b/libs/web/src/template_lualib.c @@ -44,11 +44,11 @@ int template_L_parse(lua_State *L) return rv; } -int template_L_sanitize_utf8(lua_State *L) +int template_L_utf8(lua_State *L) { size_t len = 0; const char *str = luaL_checklstring(L, 1, &len); - char *res = sanitize_utf8(str, len); + char *res = utf8(str, len); if (res != NULL) { @@ -61,11 +61,28 @@ int template_L_sanitize_utf8(lua_State *L) return 0; } -int template_L_sanitize_pcdata(lua_State *L) +int template_L_pcdata(lua_State *L) { size_t len = 0; const char *str = luaL_checklstring(L, 1, &len); - char *res = sanitize_pcdata(str, len); + char *res = pcdata(str, len); + + if (res != NULL) + { + lua_pushstring(L, res); + free(res); + + return 1; + } + + return 0; +} + +int template_L_striptags(lua_State *L) +{ + size_t len = 0; + const char *str = luaL_checklstring(L, 1, &len); + char *res = striptags(str, len); if (res != NULL) { @@ -129,8 +146,9 @@ static int template_L_hash(lua_State *L) { /* module table */ static const luaL_reg R[] = { { "parse", template_L_parse }, - { "sanitize_utf8", template_L_sanitize_utf8 }, - { "sanitize_pcdata", template_L_sanitize_pcdata }, + { "utf8", template_L_utf8 }, + { "pcdata", template_L_pcdata }, + { "striptags", template_L_striptags }, { "load_catalog", template_L_load_catalog }, { "close_catalog", template_L_close_catalog }, { "change_catalog", template_L_change_catalog }, diff --git a/libs/web/src/template_parser.c b/libs/web/src/template_parser.c index 76fb5a7c9..605445131 100644 --- a/libs/web/src/template_parser.c +++ b/libs/web/src/template_parser.c @@ -244,7 +244,7 @@ template_format_chunk(struct template_parser *parser, size_t *sz) switch (c->type) { case T_TYPE_TEXT: - escape_luastr(buf, c->s, c->e - c->s, 0); + luastr_escape(buf, c->s, c->e - c->s, 0); break; case T_TYPE_EXPR: @@ -254,15 +254,15 @@ template_format_chunk(struct template_parser *parser, size_t *sz) break; case T_TYPE_INCLUDE: - escape_luastr(buf, c->s, c->e - c->s, 0); + luastr_escape(buf, c->s, c->e - c->s, 0); break; case T_TYPE_I18N: - translate_luastr(buf, c->s, c->e - c->s, 1); + luastr_translate(buf, c->s, c->e - c->s, 1); break; case T_TYPE_I18N_RAW: - translate_luastr(buf, c->s, c->e - c->s, 0); + luastr_translate(buf, c->s, c->e - c->s, 0); break; case T_TYPE_CODE: diff --git a/libs/web/src/template_utils.c b/libs/web/src/template_utils.c index 6ed20d355..80542bd4f 100644 --- a/libs/web/src/template_utils.c +++ b/libs/web/src/template_utils.c @@ -278,7 +278,7 @@ static int _validate_utf8(unsigned char **s, int l, struct template_buffer *buf) } /* sanitize given string and replace all invalid UTF-8 sequences with "?" */ -char * sanitize_utf8(const char *s, unsigned int l) +char * utf8(const char *s, unsigned int l) { struct template_buffer *buf = buf_init(l); unsigned char *ptr = (unsigned char *)s; @@ -312,7 +312,7 @@ char * sanitize_utf8(const char *s, unsigned int l) /* Sanitize given string and strip all invalid XML bytes * Validate UTF-8 sequences * Escape XML control chars */ -char * sanitize_pcdata(const char *s, unsigned int l) +char * pcdata(const char *s, unsigned int l) { struct template_buffer *buf = buf_init(l); unsigned char *ptr = (unsigned char *)s; @@ -368,7 +368,67 @@ char * sanitize_pcdata(const char *s, unsigned int l) return buf_destroy(buf); } -void escape_luastr(struct template_buffer *out, const char *s, unsigned int l, +char * striptags(const char *s, unsigned int l) +{ + struct template_buffer *buf = buf_init(l); + unsigned char *ptr = (unsigned char *)s; + unsigned char *end = ptr + l; + unsigned char *tag; + unsigned char prev; + char esq[8]; + int esl; + + for (prev = ' '; ptr < end; ptr++) + { + if ((*ptr == '<') && ((ptr + 2) < end) && + ((*(ptr + 1) == '/') || isalpha(*(ptr + 1)))) + { + for (tag = ptr; tag < end; tag++) + { + if (*tag == '>') + { + if (!isspace(prev)) + buf_putchar(buf, ' '); + + ptr = tag; + prev = ' '; + break; + } + } + } + else if (isspace(*ptr)) + { + if (!isspace(prev)) + buf_putchar(buf, *ptr); + + prev = *ptr; + } + else + { + switch(*ptr) + { + case '"': + case '\'': + case '<': + case '>': + case '&': + esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr); + buf_append(buf, esq, esl); + break; + + default: + buf_putchar(buf, *ptr); + break; + } + + prev = *ptr; + } + } + + return buf_destroy(buf); +} + +void luastr_escape(struct template_buffer *out, const char *s, unsigned int l, int escape_xml) { int esl; @@ -411,7 +471,7 @@ void escape_luastr(struct template_buffer *out, const char *s, unsigned int l, } } -void translate_luastr(struct template_buffer *out, const char *s, unsigned int l, +void luastr_translate(struct template_buffer *out, const char *s, unsigned int l, int escape_xml) { char *tr; @@ -420,11 +480,11 @@ void translate_luastr(struct template_buffer *out, const char *s, unsigned int l switch (lmo_translate(s, l, &tr, &trlen)) { case 0: - escape_luastr(out, tr, trlen, escape_xml); + luastr_escape(out, tr, trlen, escape_xml); break; case -1: - escape_luastr(out, s, l, escape_xml); + luastr_escape(out, s, l, escape_xml); break; default: diff --git a/libs/web/src/template_utils.h b/libs/web/src/template_utils.h index 1683a3ee1..c54af757c 100644 --- a/libs/web/src/template_utils.h +++ b/libs/web/src/template_utils.h @@ -39,10 +39,11 @@ int buf_append(struct template_buffer *buf, const char *s, int len); int buf_length(struct template_buffer *buf); char * buf_destroy(struct template_buffer *buf); -char * sanitize_utf8(const char *s, unsigned int l); -char * sanitize_pcdata(const char *s, unsigned int l); +char * utf8(const char *s, unsigned int l); +char * pcdata(const char *s, unsigned int l); +char * striptags(const char *s, unsigned int l); -void escape_luastr(struct template_buffer *out, const char *s, unsigned int l, int escape_xml); -void translate_luastr(struct template_buffer *out, const char *s, unsigned int l, int escape_xml); +void luastr_escape(struct template_buffer *out, const char *s, unsigned int l, int escape_xml); +void luastr_translate(struct template_buffer *out, const char *s, unsigned int l, int escape_xml); #endif |