diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-07-23 15:18:54 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-07-23 15:18:54 +0100 |
commit | 5c6e7257f828ee482f9f0154390646b8e049f466 (patch) | |
tree | 233ece67c74c050fdc78eb87b9b27ddccedeb6d5 /src/lua/lua_html.c | |
parent | 9849dfadb597e7def4e415ec9aa144071cdd5d1c (diff) | |
download | rspamd-5c6e7257f828ee482f9f0154390646b8e049f466.tar.gz rspamd-5c6e7257f828ee482f9f0154390646b8e049f466.zip |
Implement lua_html methods.
Diffstat (limited to 'src/lua/lua_html.c')
-rw-r--r-- | src/lua/lua_html.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/lua/lua_html.c b/src/lua/lua_html.c index 94bd7b982..79abc0a39 100644 --- a/src/lua/lua_html.c +++ b/src/lua/lua_html.c @@ -47,11 +47,158 @@ rspamd_config.R_HTML_IMAGE = function (task) end */ +/*** + * @method html:has_tag(name) + * Checks if a specified tag `name` is presented in a part + * @param {string} name name of tag to check + * @return {boolean} `true` if the tag exists in HTML tree + */ +LUA_FUNCTION_DEF (html, has_tag); + +/*** + * @method html:check_property(name) + * Checks if the HTML has a specific property. Here is the list of available properties: + * + * - `no_html` - no html tag presented + * - `bad_element` - part has some broken elements + * - `xml` - part is xhtml + * - `unknown_element` - part has some unknown elements + * - `duplicate_element` - part has some duplicate elements that should be unique (namely, `title` tag) + * - `unbalanced` - part has unbalanced tags + * @param {string} name name of property + * @return {boolean} true if the part has the specified property + */ +LUA_FUNCTION_DEF (html, has_property); + +/*** + * @method html:get_images() + * Returns table of images found in html. Each image is, in turn, a table with the following fields: + * + * - `src` - link to the source + * - `height` - height in pixels + * - `width` - width in pixels + * - `embeded` - `true` if an image is embedded in a message + * @return {table} table of images in html part + */ +LUA_FUNCTION_DEF (html, get_images); + static const struct luaL_reg htmllib_m[] = { + LUA_INTERFACE_DEF (html, has_tag), + LUA_INTERFACE_DEF (html, has_property), + LUA_INTERFACE_DEF (html, get_images), {"__tostring", rspamd_lua_class_tostring}, {NULL, NULL} }; +static struct html_content * +lua_check_html (lua_State * L, gint pos) +{ + void *ud = luaL_checkudata (L, pos, "rspamd{html}"); + luaL_argcheck (L, ud != NULL, pos, "'html' expected"); + return ud ? *((struct html_content **)ud) : NULL; +} + +static gint +lua_html_has_tag (lua_State *L) +{ + struct html_content *hc = lua_check_html (L, 1); + const gchar *tagname = luaL_checkstring (L, 2); + gboolean ret = FALSE; + + if (hc && tagname) { + if (rspamd_html_tag_seen (hc, tagname)) { + ret = TRUE; + } + } + + lua_pushboolean (L, ret); + + return 1; +} + +static gint +lua_html_has_property (lua_State *L) +{ + struct html_content *hc = lua_check_html (L, 1); + const gchar *propname = luaL_checkstring (L, 2); + gboolean ret = FALSE; + + if (hc && propname) { + /* + * - `no_html` + * - `bad_element` + * - `xml` + * - `unknown_element` + * - `duplicate_element` + * - `unbalanced` + */ + if (strcmp (propname, "no_html") == 0) { + ret = hc->flags & RSPAMD_HTML_FLAG_BAD_START; + } + else if (strcmp (propname, "bad_element") == 0) { + ret = hc->flags & RSPAMD_HTML_FLAG_BAD_ELEMENTS; + } + else if (strcmp (propname, "xml") == 0) { + ret = hc->flags & RSPAMD_HTML_FLAG_XML; + } + else if (strcmp (propname, "unknown_element") == 0) { + ret = hc->flags & RSPAMD_HTML_FLAG_UNKNOWN_ELEMENTS; + } + else if (strcmp (propname, "duplicate_element") == 0) { + ret = hc->flags & RSPAMD_HTML_FLAG_DUPLICATE_ELEMENTS; + } + else if (strcmp (propname, "unbalanced") == 0) { + ret = hc->flags & RSPAMD_HTML_FLAG_UNBALANCED; + } + } + + lua_pushboolean (L, ret); + + return 1; +} + +static gint +lua_html_get_images (lua_State *L) +{ + struct html_content *hc = lua_check_html (L, 1); + struct html_image *img; + guint i; + + if (hc != NULL) { + lua_newtable (L); + + if (hc->images) { + for (i = 0; i < hc->images->len; i ++) { + img = g_ptr_array_index (hc->images, i); + + lua_newtable (L); + + if (img->src) { + lua_pushstring (L, "src"); + lua_pushstring (L, img->src); + lua_settable (L, -3); + } + + lua_pushstring (L, "height"); + lua_pushnumber (L, img->height); + lua_settable (L, -3); + lua_pushstring (L, "width"); + lua_pushnumber (L, img->width); + lua_settable (L, -3); + lua_pushstring (L, "embedded"); + lua_pushboolean (L, img->flags & RSPAMD_HTML_FLAG_IMAGE_EMBEDDED); + lua_settable (L, -3); + + lua_rawseti (L, -2, i + 1); + } + } + } + else { + lua_pushnil (L); + } + + return 1; +} void luaopen_html (lua_State * L) |