From 08bb2e8e8c39dbaa9bce29a227eb875f5999c941 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 26 Mar 2018 11:55:03 +0100 Subject: [PATCH] [Feature] Add method to receive all URL flags from Lua API --- src/lua/lua_url.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/lua/lua_url.c b/src/lua/lua_url.c index cbe9148a3..d0046d5d1 100644 --- a/src/lua/lua_url.c +++ b/src/lua/lua_url.c @@ -49,6 +49,7 @@ LUA_FUNCTION_DEF (url, get_fragment); LUA_FUNCTION_DEF (url, get_text); LUA_FUNCTION_DEF (url, get_raw); LUA_FUNCTION_DEF (url, get_tld); +LUA_FUNCTION_DEF (url, get_flags); LUA_FUNCTION_DEF (url, to_table); LUA_FUNCTION_DEF (url, is_phished); LUA_FUNCTION_DEF (url, is_redirected); @@ -796,6 +797,72 @@ lua_url_all (lua_State *L) return 1; } +/*** + * @method url:get_flags() + * Return flags for a specified URL as map 'flag'->true for all flags set, + * possible flags are: + * + * - `phished`: URL is likely phished + * - `numeric`: URL is numeric (e.g. IP address) + * - `obscured`: URL was obscured + * - `redirected`: URL comes from redirector + * - `html_displayed`: URL is used just for displaying purposes + * - `text`: URL comes from the text + * - `subject`: URL comes from the subject + * - `host_encoded`: URL host part is encoded + * - `schema_encoded`: URL schema part is encoded + * - `query_encoded`: URL query part is encoded + * - `missing_slahes`: URL has some slashes missing + * - `idn`: URL has international characters + * - `has_port`: URL has port + * - `has_user`: URL has user part + * - `schemaless`: URL has no schema + * @return {table} URL flags + */ +#define PUSH_FLAG(fl, name) do { \ + if (flags & (fl)) { \ + lua_pushstring (L, (name)); \ + lua_pushboolean (L, true); \ + lua_settable (L, -3); \ + } \ +} while (0) + +static gint +lua_url_get_flags (lua_State *L) +{ + struct rspamd_lua_url *url = lua_check_url (L, 1); + enum rspamd_url_flags flags; + + if (url != NULL) { + flags = url->url->flags; + + lua_createtable (L, 0, 4); + + PUSH_FLAG (RSPAMD_URL_FLAG_PHISHED, "phished"); + PUSH_FLAG (RSPAMD_URL_FLAG_NUMERIC, "numeric"); + PUSH_FLAG (RSPAMD_URL_FLAG_OBSCURED, "obscured"); + PUSH_FLAG (RSPAMD_URL_FLAG_REDIRECTED, "redirected"); + PUSH_FLAG (RSPAMD_URL_FLAG_HTML_DISPLAYED, "html_displayed"); + PUSH_FLAG (RSPAMD_URL_FLAG_FROM_TEXT, "text"); + PUSH_FLAG (RSPAMD_URL_FLAG_SUBJECT, "subject"); + PUSH_FLAG (RSPAMD_URL_FLAG_HOSTENCODED, "host_encoded"); + PUSH_FLAG (RSPAMD_URL_FLAG_SCHEMAENCODED, "schema_encoded"); + PUSH_FLAG (RSPAMD_URL_FLAG_PATHENCODED, "path_encoded"); + PUSH_FLAG (RSPAMD_URL_FLAG_QUERYENCODED, "query_encoded"); + PUSH_FLAG (RSPAMD_URL_FLAG_MISSINGSLASHES, "missing_slahes"); + PUSH_FLAG (RSPAMD_URL_FLAG_IDN, "idn"); + PUSH_FLAG (RSPAMD_URL_FLAG_HAS_PORT, "has_port"); + PUSH_FLAG (RSPAMD_URL_FLAG_HAS_USER, "has_user"); + PUSH_FLAG (RSPAMD_URL_FLAG_SCHEMALESS, "schemaless"); + } + else { + return luaL_error (L, "invalid arguments"); + } + + return 1; +} + +#undef PUSH_FLAG static gint lua_load_url (lua_State * L) -- 2.39.5