You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

selectors.lua 9.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. local msg
  2. context("Selectors test", function()
  3. local rspamd_task = require "rspamd_task"
  4. local logger = require "rspamd_logger"
  5. local lua_selectors = require "lua_selectors"
  6. local test_helper = require "rspamd_test_helper"
  7. local cfg = rspamd_config
  8. local task
  9. test_helper.init_url_parser()
  10. before(function()
  11. local res
  12. res,task = rspamd_task.load_from_string(msg, cfg)
  13. task:set_from_ip("198.172.22.91")
  14. task:set_user("cool user name")
  15. task:set_helo("hello mail")
  16. task:set_request_header("hdr1", "value1")
  17. task:process_message()
  18. task:get_mempool():set_variable("int_var", 1)
  19. task:get_mempool():set_variable("str_var", "str 1")
  20. if not res then
  21. assert_true(false, "failed to load message")
  22. end
  23. end)
  24. local function check_selector(selector_string)
  25. local sels = lua_selectors.parse_selector(cfg, selector_string)
  26. local elts = lua_selectors.process_selectors(task, sels)
  27. return elts
  28. end
  29. local cases = {
  30. ["ip"] = {
  31. selector = "ip",
  32. expect = {"198.172.22.91"}},
  33. ["header Subject"] = {
  34. selector = "header(Subject)",
  35. expect = {"Second, lower-cased header subject"}},
  36. ["header Subject lower"] = {
  37. selector = "header(Subject).lower",
  38. expect = {"second, lower-cased header subject"}},
  39. ["header full Subject lower"] = {
  40. selector = "header(Subject, 'full').lower",
  41. expect = {{"second, lower-cased header subject", "test subject"}}},
  42. ["header full strong Subject"] = {
  43. selector = "header(Subject, 'full,strong')",
  44. expect = {{"Test subject"}}},
  45. ["header full strong lower-cased Subject"] = {
  46. selector = "header(subject, 'full,strong')",
  47. expect = {{"Second, lower-cased header subject"}}},
  48. ["digest"] = {
  49. selector = "digest",
  50. expect = {"2216397bc061bb6968e1836f3680fed0"}},
  51. ["user"] = {
  52. selector = "user",
  53. expect = {"cool user name"}},
  54. ["from"] = {
  55. selector = "from",
  56. expect = {"whoknows@nowhere.com"}},
  57. ["rcpts"] = {
  58. selector = "rcpts",
  59. expect = {{"nobody@example.com", "no-one@example.com"}}},
  60. ["1st rcpts"] = {
  61. selector = "rcpts.nth(1)",
  62. expect = {"nobody@example.com"}},
  63. ["lower rcpts"] = {
  64. selector = "rcpts.lower.first",
  65. expect = {"nobody@example.com"}},
  66. ["first rcpts"] = {
  67. selector = "rcpts.first",
  68. expect = {"nobody@example.com"}},
  69. ["first addr rcpts"] = {
  70. selector = "rcpts:addr.first",
  71. expect = {"nobody@example.com"}},
  72. ["to"] = {
  73. selector = "to",
  74. expect = {"nobody@example.com"}},
  75. ["attachments"] = {
  76. selector = "attachments",
  77. expect = {{"ce112d07c52ae649f9646f3d0b5aaab5d4834836d771c032d1a75059d31fed84f38e00c0b205918f6d354934c2055d33d19d045f783a62561f467728ebcf0160",
  78. "ce112d07c52ae649f9646f3d0b5aaab5d4834836d771c032d1a75059d31fed84f38e00c0b205918f6d354934c2055d33d19d045f783a62561f467728ebcf0160"
  79. }}},
  80. ["attachments id"] = {
  81. selector = "attachments.id",
  82. expect = {""}},
  83. ["files"] = {
  84. selector = "files",
  85. expect = {{"f.zip", "f2.zip"}}},
  86. ["helo"] = {
  87. selector = "helo",
  88. expect = {"hello mail"}},
  89. ["received by hostname"] = {
  90. selector = "received:by_hostname",
  91. expect = {{"server.chat-met-vreemden.nl"}}},
  92. ["urls"] = {
  93. selector = "urls",
  94. expect = {{"http://example.net"}}},
  95. ["emails"] = {
  96. selector = "emails",
  97. expect = {{"mailto://test@example.net"}}},
  98. ["pool_var str, default type"] = {
  99. selector = [[pool_var("str_var")]],
  100. expect = {"str 1"}},
  101. ["pool_var str"] = {
  102. selector = [[pool_var("str_var", 'string')]],
  103. expect = {"str 1"}},
  104. ["pool_var double"] = {
  105. selector = [[pool_var("int_var", 'double')]],
  106. expect = {"1"}},
  107. ["time"] = {
  108. selector = "time",
  109. expect = {"1537364211"}},
  110. ["request_header"] = {
  111. selector = "request_header(hdr1)",
  112. expect = {"value1"}},
  113. ["get_host"] = {
  114. selector = "urls:get_host",
  115. expect = {{"example.net"}}},
  116. ["get_tld"] = {
  117. selector = "urls:get_tld",
  118. expect = {{"example.net"}}},
  119. ["transformation regexp"] = {
  120. selector = "urls:get_tld.regexp('\\.([\\w]+)$')",
  121. expect = {{{".net", "net"}}}},
  122. ["transformation id"] = {
  123. selector = "urls:get_tld.id",
  124. expect = {''}},
  125. ["transformation id arg"] = {
  126. selector = "urls:get_tld.id('1')",
  127. expect = {'1'}},
  128. ["transformation id args"] = {
  129. selector = "urls:get_tld.id('1', '2', '3')",
  130. expect = {{'1', '2', '3'}}},
  131. ["transformation in"] = {
  132. selector = "time(message, '!%w').in(2,3,4)",
  133. expect = {'3'}},
  134. ["transformation in id"] = {
  135. selector = "time(message, '!%w').in(2,3,4).id",
  136. expect = {''}},
  137. ["transformation not in"] = {
  138. selector = "time(message, '!%w').not_in(1,6,7)",
  139. expect = {'3'}},
  140. ["transformation in not id"] = {
  141. selector = "time(message, '!%w').not_in(1,6,7).id",
  142. expect = {''}},
  143. ["transformation in not id 1"] = {
  144. selector = "time(message, '!%w').not_in(1,6,7).id(1)",
  145. expect = {'1'}},
  146. ["transformation take"] = {
  147. selector = "rcpts.take_n(1).lower",
  148. expect = {{'nobody@example.com'}}},
  149. ["transformation take 2"] = {
  150. selector = "rcpts.take_n(2).lower",
  151. expect = {{'nobody@example.com', 'no-one@example.com'}}},
  152. ["transformation take 3"] = {
  153. selector = "rcpts.take_n(3).lower",
  154. expect = {{'nobody@example.com', 'no-one@example.com'}}},
  155. ["transformation nth"] = {
  156. selector = "rcpts.nth(1).lower",
  157. expect = {'nobody@example.com'}},
  158. ["transformation nth 2"] = {
  159. selector = "rcpts.nth(2).lower",
  160. expect = {'no-one@example.com'}},
  161. ["transformation substring"] = {
  162. selector = "header(Subject, strong).substring(6)",
  163. expect = {'subject'}},
  164. ["transformation substring 2"] = {
  165. selector = "header(Subject, strong).substring(6, 7)",
  166. expect = {'su'}},
  167. ["transformation substring -4"] = {
  168. selector = "header(Subject, strong).substring(-4)",
  169. expect = {'ject'}},
  170. }
  171. for case_name, case in pairs(cases) do
  172. test("case " .. case_name, function()
  173. local elts = check_selector(case.selector)
  174. assert_not_nil(elts)
  175. assert_rspamd_table_eq({actual = elts, expect = case.expect})
  176. end)
  177. end
  178. end)
  179. --[=========[ ******************* message ******************* ]=========]
  180. msg = [[
  181. Received: from ca-18-193-131.service.infuturo.it ([151.18.193.131] helo=User)
  182. by server.chat-met-vreemden.nl with esmtpa (Exim 4.76)
  183. (envelope-from <upwest201diana@outlook.com>)
  184. id 1ZC1sl-0006b4-TU; Mon, 06 Jul 2015 10:36:08 +0200
  185. From: <whoknows@nowhere.com>
  186. To: <nobody@example.com>, <no-one@example.com>
  187. Date: Wed, 19 Sep 2018 14:36:51 +0100 (BST)
  188. subject: Second, lower-cased header subject
  189. Subject: Test subject
  190. Content-Type: multipart/alternative;
  191. boundary="_000_6be055295eab48a5af7ad4022f33e2d0_"
  192. --_000_6be055295eab48a5af7ad4022f33e2d0_
  193. Content-Type: text/plain; charset="utf-8"
  194. Content-Transfer-Encoding: base64
  195. Hello world
  196. --_000_6be055295eab48a5af7ad4022f33e2d0_
  197. Content-Type: text/html; charset="utf-8"
  198. <html><body>
  199. <a href="http://example.net">http://example.net</a>
  200. <a href="mailto:test@example.net">mail me</a>
  201. </html>
  202. --_000_6be055295eab48a5af7ad4022f33e2d0_
  203. Content-Type: application/zip; name=f.zip
  204. Content-Disposition: attachment; size=166; filename=f.zip
  205. Content-Transfer-Encoding: base64
  206. UEsDBAoAAAAAAINe6kgAAAAAAAAAAAAAAAAIABwAZmFrZS5leGVVVAkAA8YaglfGGoJXdXgLAAEE
  207. 6AMAAAToAwAAUEsBAh4DCgAAAAAAg17qSAAAAAAAAAAAAAAAAAgAGAAAAAAAAAAAALSBAAAAAGZh
  208. a2UuZXhlVVQFAAPGGoJXdXgLAAEE6AMAAAToAwAAUEsFBgAAAAABAAEATgAAAEIAAAAAAA==
  209. --_000_6be055295eab48a5af7ad4022f33e2d0_
  210. Content-Type: application/zip; name=f.zip
  211. Content-Disposition: attachment; size=166; filename=f2.zip
  212. Content-Transfer-Encoding: base64
  213. UEsDBAoAAAAAAINe6kgAAAAAAAAAAAAAAAAIABwAZmFrZS5leGVVVAkAA8YaglfGGoJXdXgLAAEE
  214. 6AMAAAToAwAAUEsBAh4DCgAAAAAAg17qSAAAAAAAAAAAAAAAAAgAGAAAAAAAAAAAALSBAAAAAGZh
  215. a2UuZXhlVVQFAAPGGoJXdXgLAAEE6AMAAAToAwAAUEsFBgAAAAABAAEATgAAAEIAAAAAAA==
  216. ]]