aboutsummaryrefslogtreecommitdiffstats
path: root/src/lua/lua_html.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-07-23 15:18:54 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-07-23 15:18:54 +0100
commit5c6e7257f828ee482f9f0154390646b8e049f466 (patch)
tree233ece67c74c050fdc78eb87b9b27ddccedeb6d5 /src/lua/lua_html.c
parent9849dfadb597e7def4e415ec9aa144071cdd5d1c (diff)
downloadrspamd-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.c147
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)