shadowbq-threatinator 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +66 -0
  3. data/CONTRIBUTING.md +119 -0
  4. data/Gemfile +38 -0
  5. data/LICENSE +165 -0
  6. data/README.md +101 -0
  7. data/Rakefile +47 -0
  8. data/VERSION +1 -0
  9. data/bin/threatinator +5 -0
  10. data/bin/threatinator_loader +21 -0
  11. data/feeds/ET_block-ip_reputation.feed +27 -0
  12. data/feeds/ET_compromised-ip_reputation.feed +20 -0
  13. data/feeds/ET_openbadlist-ip_reputation.feed +36 -0
  14. data/feeds/alienvault-ip_reputation.feed +39 -0
  15. data/feeds/arbor_fastflux-domain_reputation.feed +19 -0
  16. data/feeds/arbor_ssh-ip_reputation.feed +24 -0
  17. data/feeds/autoshun_shunlist.feed +17 -0
  18. data/feeds/bambenek_c2_masterlist-domain_reputation.feed +16 -0
  19. data/feeds/bambenek_c2_masterlist-ip_reputation.feed +16 -0
  20. data/feeds/bambenek_dga_feed-domain_reputation.feed +16 -0
  21. data/feeds/berkeley-ip_reputation.feed +25 -0
  22. data/feeds/bitcash_cz_blacklist.feed +22 -0
  23. data/feeds/blocklist_de_apache-ip_reputation.feed +26 -0
  24. data/feeds/blocklist_de_bots-ip_reputation.feed +26 -0
  25. data/feeds/blocklist_de_ftp-ip_reputation.feed +25 -0
  26. data/feeds/blocklist_de_imap-ip_reputation.feed +25 -0
  27. data/feeds/blocklist_de_pop3-ip_reputation.feed +26 -0
  28. data/feeds/blocklist_de_proftpd-ip_reputation.feed +26 -0
  29. data/feeds/blocklist_de_sip-ip_reputation.feed +25 -0
  30. data/feeds/blocklist_de_ssh-ip_reputation.feed +25 -0
  31. data/feeds/blocklist_de_strongips-ip_reputation.feed +25 -0
  32. data/feeds/botscout-ip_reputation.feed +25 -0
  33. data/feeds/cert_mxpoison-ip_reputation.feed +22 -0
  34. data/feeds/chaosreigns-ip_reputation.feed +37 -0
  35. data/feeds/ciarmy-ip_reputation.feed +20 -0
  36. data/feeds/cruzit-ip_reputation.feed +30 -0
  37. data/feeds/cydef_torexit-ip_reputation.feed +25 -0
  38. data/feeds/dan_me_uk_torlist-ip_reputation.feed +25 -0
  39. data/feeds/danger_bruteforce-ip_reputation.feed +24 -0
  40. data/feeds/dshield_attackers-top1000.feed +34 -0
  41. data/feeds/falconcrest-ip_reputation.feed +19 -0
  42. data/feeds/feodo-domain_reputation.feed +19 -0
  43. data/feeds/feodo-ip_reputation.feed +20 -0
  44. data/feeds/h3x_asprox.feed +18 -0
  45. data/feeds/hosts-file_hphostspartial-domain_reputation.feed +19 -0
  46. data/feeds/infiltrated-ip_reputation.feed +26 -0
  47. data/feeds/infiltrated_vabl-ip_reputation.feed +30 -0
  48. data/feeds/isc_suspicious_high-domain_reputation.feed +26 -0
  49. data/feeds/isc_suspicious_low-domain_reputation.feed +26 -0
  50. data/feeds/isc_suspicious_medium-domain_reputation.feed +26 -0
  51. data/feeds/malc0de-domain_reputation.feed +24 -0
  52. data/feeds/malc0de-ip_reputation.feed +26 -0
  53. data/feeds/malwaredomainlist-url_reputation.feed +18 -0
  54. data/feeds/malwaredomains-domain_reputation.feed +29 -0
  55. data/feeds/malwaredomains_dyndns-domain_reputation.feed +29 -0
  56. data/feeds/malwaredomains_justdomains-domain_reputation.feed +20 -0
  57. data/feeds/mirc-domain_reputation.feed +30 -0
  58. data/feeds/multiproxy-ip_reputation.feed +22 -0
  59. data/feeds/nothink_irc-ip_reputation.feed +23 -0
  60. data/feeds/nothink_ssh-ip_reputation.feed +21 -0
  61. data/feeds/openbl-ip_reputation.feed +21 -0
  62. data/feeds/openphish-url_reputation.feed +24 -0
  63. data/feeds/packetmail_perimeterbad-ip_reputation.feed +28 -0
  64. data/feeds/palevo-domain_reputation.feed +22 -0
  65. data/feeds/palevo-ip_reputation.feed +23 -0
  66. data/feeds/phishtank.feed +22 -0
  67. data/feeds/sigmaproject_atma.feed +27 -0
  68. data/feeds/sigmaproject_spyware.feed +28 -0
  69. data/feeds/sigmaproject_webexploit.feed +26 -0
  70. data/feeds/snort_bpf-ip_reputation.feed +19 -0
  71. data/feeds/spyeye-domain_reputation.feed +18 -0
  72. data/feeds/spyeye-ip_reputation.feed +19 -0
  73. data/feeds/steeman-ip_reputation.feed +20 -0
  74. data/feeds/t-arend-de_ssh-ip_reputation.feed +20 -0
  75. data/feeds/the_haleys_ssh-ip_reputation.feed +20 -0
  76. data/feeds/trustedsec-ip_reputation.feed +18 -0
  77. data/feeds/virbl-ip_reputation.feed +25 -0
  78. data/feeds/vxvault-url_reputation.feed +23 -0
  79. data/feeds/yourcmc_ssh-ip_reputation.feed +20 -0
  80. data/feeds/yoyo_adservers-domain_reputation.feed +17 -0
  81. data/feeds/zeus-domain_reputation.feed +19 -0
  82. data/feeds/zeus-ip_reputation.feed +21 -0
  83. data/lib/threatinator/action.rb +14 -0
  84. data/lib/threatinator/actions/list/action.rb +97 -0
  85. data/lib/threatinator/actions/list/config.rb +12 -0
  86. data/lib/threatinator/actions/list.rb +2 -0
  87. data/lib/threatinator/actions/run/action.rb +57 -0
  88. data/lib/threatinator/actions/run/config.rb +32 -0
  89. data/lib/threatinator/actions/run/coverage_observer.rb +59 -0
  90. data/lib/threatinator/actions/run/output_config.rb +59 -0
  91. data/lib/threatinator/actions/run/status_observer.rb +37 -0
  92. data/lib/threatinator/actions/run.rb +2 -0
  93. data/lib/threatinator/cli/action_builder.rb +33 -0
  94. data/lib/threatinator/cli/list_action_builder.rb +19 -0
  95. data/lib/threatinator/cli/parser.rb +123 -0
  96. data/lib/threatinator/cli/run_action_builder.rb +41 -0
  97. data/lib/threatinator/cli.rb +19 -0
  98. data/lib/threatinator/config/base.rb +35 -0
  99. data/lib/threatinator/config/feed_search.rb +25 -0
  100. data/lib/threatinator/config/logger.rb +14 -0
  101. data/lib/threatinator/config.rb +7 -0
  102. data/lib/threatinator/decoder.rb +24 -0
  103. data/lib/threatinator/decoders/gzip.rb +30 -0
  104. data/lib/threatinator/event.rb +63 -0
  105. data/lib/threatinator/event_builder.rb +70 -0
  106. data/lib/threatinator/exceptions.rb +58 -0
  107. data/lib/threatinator/feed.rb +88 -0
  108. data/lib/threatinator/feed_builder.rb +161 -0
  109. data/lib/threatinator/feed_registry.rb +47 -0
  110. data/lib/threatinator/feed_runner.rb +177 -0
  111. data/lib/threatinator/fetcher.rb +22 -0
  112. data/lib/threatinator/fetchers/http.rb +50 -0
  113. data/lib/threatinator/filter.rb +12 -0
  114. data/lib/threatinator/filters/block.rb +18 -0
  115. data/lib/threatinator/filters/comments.rb +16 -0
  116. data/lib/threatinator/filters/whitespace.rb +19 -0
  117. data/lib/threatinator/logger.rb +66 -0
  118. data/lib/threatinator/logging.rb +20 -0
  119. data/lib/threatinator/model/base.rb +23 -0
  120. data/lib/threatinator/model/collection.rb +89 -0
  121. data/lib/threatinator/model/observables/fqdn_collection.rb +15 -0
  122. data/lib/threatinator/model/observables/ipv4.rb +33 -0
  123. data/lib/threatinator/model/observables/ipv4_collection.rb +14 -0
  124. data/lib/threatinator/model/observables/url_collection.rb +16 -0
  125. data/lib/threatinator/model/validations/type.rb +21 -0
  126. data/lib/threatinator/model/validations.rb +1 -0
  127. data/lib/threatinator/output.rb +50 -0
  128. data/lib/threatinator/parser.rb +23 -0
  129. data/lib/threatinator/parsers/csv/parser.rb +77 -0
  130. data/lib/threatinator/parsers/csv.rb +7 -0
  131. data/lib/threatinator/parsers/getline/parser.rb +45 -0
  132. data/lib/threatinator/parsers/getline.rb +8 -0
  133. data/lib/threatinator/parsers/json/adapters/oj.rb +65 -0
  134. data/lib/threatinator/parsers/json/parser.rb +45 -0
  135. data/lib/threatinator/parsers/json/record.rb +20 -0
  136. data/lib/threatinator/parsers/json.rb +8 -0
  137. data/lib/threatinator/parsers/xml/node.rb +79 -0
  138. data/lib/threatinator/parsers/xml/node_builder.rb +39 -0
  139. data/lib/threatinator/parsers/xml/parser.rb +44 -0
  140. data/lib/threatinator/parsers/xml/path.rb +70 -0
  141. data/lib/threatinator/parsers/xml/pattern.rb +53 -0
  142. data/lib/threatinator/parsers/xml/record.rb +14 -0
  143. data/lib/threatinator/parsers/xml/sax_document.rb +64 -0
  144. data/lib/threatinator/parsers/xml.rb +8 -0
  145. data/lib/threatinator/plugin_loader.rb +115 -0
  146. data/lib/threatinator/plugins/output/amqp/config.rb +18 -0
  147. data/lib/threatinator/plugins/output/amqp.rb +41 -0
  148. data/lib/threatinator/plugins/output/csv.rb +58 -0
  149. data/lib/threatinator/plugins/output/json/config.rb +14 -0
  150. data/lib/threatinator/plugins/output/json.rb +53 -0
  151. data/lib/threatinator/plugins/output/null.rb +17 -0
  152. data/lib/threatinator/plugins/output/rubydebug.rb +16 -0
  153. data/lib/threatinator/record.rb +22 -0
  154. data/lib/threatinator/registry.rb +53 -0
  155. data/lib/threatinator/util.rb +15 -0
  156. data/lib/threatinator.rb +3 -0
  157. data/spec/feeds/ET_block-ip_reputation_spec.rb +50 -0
  158. data/spec/feeds/ET_compromised-ip_reputation_spec.rb +47 -0
  159. data/spec/feeds/ET_openbadlist-ip_reputation_spec.rb +56 -0
  160. data/spec/feeds/alienvault-ip_reputation_spec.rb +46 -0
  161. data/spec/feeds/arbor_fastflux-domain_reputation_spec.rb +46 -0
  162. data/spec/feeds/arbor_ssh-ip_reputation_spec.rb +46 -0
  163. data/spec/feeds/autoshun_shunlist_spec.rb +38 -0
  164. data/spec/feeds/bambenek_c2_masterlist-domain_reputation_spec.rb +38 -0
  165. data/spec/feeds/bambenek_c2_masterlist-ip_reputation_spec.rb +39 -0
  166. data/spec/feeds/bambenek_dga_feed-domain_reputation_spec.rb +39 -0
  167. data/spec/feeds/berkeley-ip_reputation_spec.rb +47 -0
  168. data/spec/feeds/bitcash_cz_blacklist-ip_reputation_spec.rb +50 -0
  169. data/spec/feeds/blocklist_de_apache-ip_reputation_spec.rb +47 -0
  170. data/spec/feeds/blocklist_de_bots-ip_reputation_spec.rb +47 -0
  171. data/spec/feeds/blocklist_de_ftp-ip_reputation_spec.rb +47 -0
  172. data/spec/feeds/blocklist_de_imap-ip_reputation_spec.rb +47 -0
  173. data/spec/feeds/blocklist_de_pop3-ip_reputation_spec.rb +47 -0
  174. data/spec/feeds/blocklist_de_proftpd-ip_reputation_spec.rb +47 -0
  175. data/spec/feeds/blocklist_de_sip-ip_reputation_spec.rb +47 -0
  176. data/spec/feeds/blocklist_de_ssh-ip_reputation_spec.rb +47 -0
  177. data/spec/feeds/blocklist_de_strongips-ip_reputation_spec.rb +47 -0
  178. data/spec/feeds/botscout-ip_reputation_spec.rb +50 -0
  179. data/spec/feeds/cert_mxpoison-ip_reputation_spec.rb +47 -0
  180. data/spec/feeds/chaosreigns-ip_reputation_spec.rb +50 -0
  181. data/spec/feeds/ciarmy-ip_reputation_spec.rb +47 -0
  182. data/spec/feeds/cruzit-ip_reputation_spec.rb +47 -0
  183. data/spec/feeds/cydef_torexit-ip_reputation_spec.rb +47 -0
  184. data/spec/feeds/dan_me_uk_torlist-ip_reputation_spec.rb +47 -0
  185. data/spec/feeds/danger_bruteforce-ip_reputation_spec.rb +47 -0
  186. data/spec/feeds/data/ET_block-ip_reputation.txt +80 -0
  187. data/spec/feeds/data/ET_compromised-ip_reputation.txt +11 -0
  188. data/spec/feeds/data/ET_openbadlist-ip_reputation.txt +62 -0
  189. data/spec/feeds/data/alienvault-ip_reputation.txt +18 -0
  190. data/spec/feeds/data/arbor_domainlist.txt +11 -0
  191. data/spec/feeds/data/arbor_ssh.txt +16 -0
  192. data/spec/feeds/data/autoshun_shunlist.csv +20 -0
  193. data/spec/feeds/data/bambenek_c2-dommasterlist.csv +30 -0
  194. data/spec/feeds/data/bambenek_c2-ipmasterlist.csv +27 -0
  195. data/spec/feeds/data/bambenek_dga_feed.csv +42 -0
  196. data/spec/feeds/data/berkeley.txt +29 -0
  197. data/spec/feeds/data/bitcash_cz_blacklist.txt +7 -0
  198. data/spec/feeds/data/blocklist_de_apache-ip-reputation.txt +17 -0
  199. data/spec/feeds/data/blocklist_de_bots-ip-reputation.txt +15 -0
  200. data/spec/feeds/data/blocklist_de_ftp-ip-reputation.txt +7 -0
  201. data/spec/feeds/data/blocklist_de_imap-ip-reputation.txt +8 -0
  202. data/spec/feeds/data/blocklist_de_pop3-ip-reputation.txt +11 -0
  203. data/spec/feeds/data/blocklist_de_proftpd-ip-reputation.txt +12 -0
  204. data/spec/feeds/data/blocklist_de_sip-ip-reputation.txt +9 -0
  205. data/spec/feeds/data/blocklist_de_ssh-ip-reputation.txt +10 -0
  206. data/spec/feeds/data/blocklist_de_strongips-ip-reputation.txt +11 -0
  207. data/spec/feeds/data/botscout-ip-reputation.txt +713 -0
  208. data/spec/feeds/data/cert_mxpoison-ip_reputation.txt +17 -0
  209. data/spec/feeds/data/chaosreigns-ip-reputation.txt +26 -0
  210. data/spec/feeds/data/ciarmy-ip-reputation.txt +11 -0
  211. data/spec/feeds/data/cruzit-ip-reputation.txt +14 -0
  212. data/spec/feeds/data/cydef_torexit-ip_reputation.txt +27 -0
  213. data/spec/feeds/data/dan_me_uk_torlist-ip-reputation.txt +11 -0
  214. data/spec/feeds/data/danger_bruteforce-ip_reputation.txt +12 -0
  215. data/spec/feeds/data/dshield_topattackers.xml +4 -0
  216. data/spec/feeds/data/falconcrest_iplist.txt +345 -0
  217. data/spec/feeds/data/feodo_domainlist.txt +18 -0
  218. data/spec/feeds/data/feodo_iplist.txt +20 -0
  219. data/spec/feeds/data/h3x_asprox.txt +20 -0
  220. data/spec/feeds/data/hosts-file_hphostspartial_domainlist.txt +24 -0
  221. data/spec/feeds/data/infiltrated_iplist.txt +16 -0
  222. data/spec/feeds/data/infiltrated_vabl_iplist.txt +33 -0
  223. data/spec/feeds/data/isc_suspicious_high_domainlist.txt +26 -0
  224. data/spec/feeds/data/isc_suspicious_low_domainlist.txt +34 -0
  225. data/spec/feeds/data/isc_suspicious_medium_domainlist.txt +32 -0
  226. data/spec/feeds/data/malc0de_domainlist.txt +18 -0
  227. data/spec/feeds/data/malc0de_iplist.txt +14 -0
  228. data/spec/feeds/data/malwaredomainlist-url-reputation.txt +8 -0
  229. data/spec/feeds/data/malwaredomains_domainlist.txt +24 -0
  230. data/spec/feeds/data/malwaredomains_dyndns_domainlist.txt +34 -0
  231. data/spec/feeds/data/malwaredomains_justdomains_domainlist.txt +18 -0
  232. data/spec/feeds/data/mirc_domainlist.txt +31 -0
  233. data/spec/feeds/data/multiproxy_iplist.txt +15 -0
  234. data/spec/feeds/data/nothink_irc_iplist.txt +14 -0
  235. data/spec/feeds/data/nothink_ssh_iplist.txt +10 -0
  236. data/spec/feeds/data/openbl_iplist.txt +12 -0
  237. data/spec/feeds/data/openphish-url-reputation.txt +16 -0
  238. data/spec/feeds/data/packetmail_perimeterbad-ip_reputation.txt +44 -0
  239. data/spec/feeds/data/palevo_domainlist.txt +25 -0
  240. data/spec/feeds/data/palevo_iplist.txt +24 -0
  241. data/spec/feeds/data/phishtank-sample.json.gz +0 -0
  242. data/spec/feeds/data/sigmaproject_atma.return.gz +0 -0
  243. data/spec/feeds/data/sigmaproject_spyware.return.gz +0 -0
  244. data/spec/feeds/data/sigmaproject_webexploit.return.gz +0 -0
  245. data/spec/feeds/data/snort_bpf-ip_reputation.txt +16 -0
  246. data/spec/feeds/data/spyeye_domainlist.txt +16 -0
  247. data/spec/feeds/data/spyeye_iplist.txt +19 -0
  248. data/spec/feeds/data/steeman-ip-reputation.txt +13 -0
  249. data/spec/feeds/data/t-arend-de_ssh_iplist.txt +17 -0
  250. data/spec/feeds/data/the_haleys_ssh_iplist.txt +12 -0
  251. data/spec/feeds/data/trustedsec-ip-reputation.txt +12 -0
  252. data/spec/feeds/data/valid.json +2908 -0
  253. data/spec/feeds/data/virbl-ip_reputation.txt +14 -0
  254. data/spec/feeds/data/vxvault-url-reputation.txt +15 -0
  255. data/spec/feeds/data/yourcmc_ssh-ip_reputation.txt +27 -0
  256. data/spec/feeds/data/yoyo_adservers.txt +25 -0
  257. data/spec/feeds/data/zeus-ip_reputation.txt +285 -0
  258. data/spec/feeds/data/zeus_domainlist.txt +27 -0
  259. data/spec/feeds/dshield_attackers-top1000_spec.rb +39 -0
  260. data/spec/feeds/falconcrest-ip_reputation_spec.rb +39 -0
  261. data/spec/feeds/feodo-domain_reputation_spec.rb +47 -0
  262. data/spec/feeds/feodo-ip_reputation_spec.rb +47 -0
  263. data/spec/feeds/h3x_asprox-ip_reputation_spec.rb +50 -0
  264. data/spec/feeds/hosts-file_hphostspartial-domain_reputation_spec.rb +47 -0
  265. data/spec/feeds/infiltrated-ip_reputation_spec.rb +47 -0
  266. data/spec/feeds/infiltrated_vabl-ip_reputation_spec.rb +47 -0
  267. data/spec/feeds/isc_suspicious_high-domain_reputation_spec.rb +47 -0
  268. data/spec/feeds/isc_suspicious_low-domain_reputation_spec.rb +47 -0
  269. data/spec/feeds/isc_suspicious_medium-domain_reputation_spec.rb +47 -0
  270. data/spec/feeds/malc0de-domain_reputation_spec.rb +47 -0
  271. data/spec/feeds/malc0de-ip_reputation_spec.rb +47 -0
  272. data/spec/feeds/malwaredomainlist_url_reputation_spec.rb +50 -0
  273. data/spec/feeds/malwaredomains-domain_reputation_spec.rb +47 -0
  274. data/spec/feeds/malwaredomains_dyndns-domain_reputation_spec.rb +47 -0
  275. data/spec/feeds/malwaredomains_justdomains-domain_reputation_spec.rb +47 -0
  276. data/spec/feeds/mirc-domain_reputation_spec.rb +47 -0
  277. data/spec/feeds/multiproxy-ip_reputation_spec.rb +47 -0
  278. data/spec/feeds/nothink_irc-ip_reputation_spec.rb +47 -0
  279. data/spec/feeds/nothink_ssh-ip_reputation_spec.rb +47 -0
  280. data/spec/feeds/openbl-ip_reputation_spec.rb +47 -0
  281. data/spec/feeds/openphish_url_reputation_spec.rb +50 -0
  282. data/spec/feeds/packetmail_perimeterbad-ip_reputation_spec.rb +47 -0
  283. data/spec/feeds/palevo-domain_reputation_spec.rb +47 -0
  284. data/spec/feeds/palevo-ip_reputation_spec.rb +47 -0
  285. data/spec/feeds/phishtank_spec.rb +41 -0
  286. data/spec/feeds/sigmaproject_atma_spec.rb +62 -0
  287. data/spec/feeds/sigmaproject_spyware_spec.rb +63 -0
  288. data/spec/feeds/sigmaproject_webexploit_spec.rb +62 -0
  289. data/spec/feeds/snort_bpf-ip_reputation_spec.rb +47 -0
  290. data/spec/feeds/spyeye-domain_reputation_spec.rb +47 -0
  291. data/spec/feeds/spyeye-ip_reputation_spec.rb +47 -0
  292. data/spec/feeds/steeman-ip_reputation_spec.rb +50 -0
  293. data/spec/feeds/t-arend-de_ssh-ip_reputation_spec.rb +47 -0
  294. data/spec/feeds/the_haleys_ssh-ip_reputation_spec.rb +47 -0
  295. data/spec/feeds/trustedsec-ip_reputation_spec.rb +47 -0
  296. data/spec/feeds/virbl-ip_reputation_spec.rb +47 -0
  297. data/spec/feeds/vxvault_url_reputation_spec.rb +50 -0
  298. data/spec/feeds/yourcmc_ssh-ip_reputation_spec.rb +47 -0
  299. data/spec/feeds/yoyo_adservers_spec.rb +47 -0
  300. data/spec/feeds/zeus-domain_reputation_spec.rb +47 -0
  301. data/spec/feeds/zeus-ip_reputation_spec.rb +47 -0
  302. data/spec/fixtures/feed/provider1/feed1.feed +6 -0
  303. data/spec/fixtures/parsers/test.xml +13 -0
  304. data/spec/fixtures/parsers/test_self_closing.xml +20 -0
  305. data/spec/fixtures/plugins/bad/threatinator/plugins/test_error1/plugin.rb +1 -0
  306. data/spec/fixtures/plugins/bad/threatinator/plugins/test_missing1/plugin.rb +0 -0
  307. data/spec/fixtures/plugins/fake.rb +19 -0
  308. data/spec/fixtures/plugins/good/threatinator/plugins/test_type1/plugin_a.rb +8 -0
  309. data/spec/fixtures/plugins/good/threatinator/plugins/test_type1/plugin_b.rb +8 -0
  310. data/spec/fixtures/plugins/good/threatinator/plugins/test_type2/plugin_c.rb +8 -0
  311. data/spec/fixtures/plugins/good/threatinator/plugins/test_type2/plugin_d.rb +8 -0
  312. data/spec/fixtures/plugins/good/threatinator/plugins/test_type3/plugin_e.rb +8 -0
  313. data/spec/fixtures/plugins/good/threatinator/plugins/test_type3/plugin_f.rb +8 -0
  314. data/spec/spec_helper.rb +54 -0
  315. data/spec/support/bad_feeds/missing_fetcher.feed +7 -0
  316. data/spec/support/bad_feeds/missing_name.feed +6 -0
  317. data/spec/support/bad_feeds/missing_parser.feed +3 -0
  318. data/spec/support/bad_feeds/missing_provider.feed +5 -0
  319. data/spec/support/factories/event.rb +31 -0
  320. data/spec/support/factories/feed.rb +59 -0
  321. data/spec/support/factories/feed_builder.rb +65 -0
  322. data/spec/support/factories/feed_registry.rb +8 -0
  323. data/spec/support/factories/ipv4.rb +36 -0
  324. data/spec/support/factories/output.rb +11 -0
  325. data/spec/support/factories/record.rb +17 -0
  326. data/spec/support/factories/url.rb +34 -0
  327. data/spec/support/factories/xml_node.rb +33 -0
  328. data/spec/support/helpers/io.rb +11 -0
  329. data/spec/support/helpers/models.rb +13 -0
  330. data/spec/support/shared/action_builder.rb +47 -0
  331. data/spec/support/shared/decoder.rb +70 -0
  332. data/spec/support/shared/feed_runner_observer.rb +136 -0
  333. data/spec/support/shared/feeds.rb +233 -0
  334. data/spec/support/shared/fetcher.rb +48 -0
  335. data/spec/support/shared/filter.rb +14 -0
  336. data/spec/support/shared/io-like.rb +7 -0
  337. data/spec/support/shared/model/collection.rb +164 -0
  338. data/spec/support/shared/output.rb +120 -0
  339. data/spec/support/shared/parsers.rb +51 -0
  340. data/spec/support/shared/record.rb +111 -0
  341. data/spec/threatinator/actions/list/action_spec.rb +148 -0
  342. data/spec/threatinator/actions/run/action_spec.rb +106 -0
  343. data/spec/threatinator/actions/run/config_spec.rb +39 -0
  344. data/spec/threatinator/actions/run/coverage_observer_spec.rb +151 -0
  345. data/spec/threatinator/actions/run/output_config_spec.rb +89 -0
  346. data/spec/threatinator/actions/run/status_observer_spec.rb +86 -0
  347. data/spec/threatinator/cli/list_action_builder_spec.rb +57 -0
  348. data/spec/threatinator/cli/run_action_builder_spec.rb +133 -0
  349. data/spec/threatinator/cli_spec.rb +175 -0
  350. data/spec/threatinator/config/base_spec.rb +39 -0
  351. data/spec/threatinator/config/feed_search_spec.rb +76 -0
  352. data/spec/threatinator/decoders/gzip_spec.rb +75 -0
  353. data/spec/threatinator/event_builder_spec.rb +123 -0
  354. data/spec/threatinator/event_spec.rb +254 -0
  355. data/spec/threatinator/event_spec.rb.new +319 -0
  356. data/spec/threatinator/feed_builder_spec.rb +633 -0
  357. data/spec/threatinator/feed_registry_spec.rb +198 -0
  358. data/spec/threatinator/feed_runner_spec.rb +372 -0
  359. data/spec/threatinator/feed_spec.rb +169 -0
  360. data/spec/threatinator/fetcher_spec.rb +12 -0
  361. data/spec/threatinator/fetchers/http_spec.rb +32 -0
  362. data/spec/threatinator/filter_spec.rb +13 -0
  363. data/spec/threatinator/filters/block_spec.rb +16 -0
  364. data/spec/threatinator/filters/comments_spec.rb +13 -0
  365. data/spec/threatinator/filters/whitespace_spec.rb +12 -0
  366. data/spec/threatinator/logger_spec.rb +29 -0
  367. data/spec/threatinator/model/observables/fqdn_collection_spec.rb +41 -0
  368. data/spec/threatinator/model/observables/ipv4_collection_spec.rb +36 -0
  369. data/spec/threatinator/model/observables/ipv4_spec.rb +75 -0
  370. data/spec/threatinator/model/observables/url_collection_spec.rb +45 -0
  371. data/spec/threatinator/model/validations/type_spec.rb +37 -0
  372. data/spec/threatinator/parser_spec.rb +13 -0
  373. data/spec/threatinator/parsers/csv/parser_spec.rb +202 -0
  374. data/spec/threatinator/parsers/getline/parser_spec.rb +83 -0
  375. data/spec/threatinator/parsers/json/parser_spec.rb +106 -0
  376. data/spec/threatinator/parsers/json/record_spec.rb +30 -0
  377. data/spec/threatinator/parsers/xml/node_spec.rb +335 -0
  378. data/spec/threatinator/parsers/xml/parser_spec.rb +263 -0
  379. data/spec/threatinator/parsers/xml/path_spec.rb +209 -0
  380. data/spec/threatinator/parsers/xml/pattern_spec.rb +72 -0
  381. data/spec/threatinator/parsers/xml/record_spec.rb +27 -0
  382. data/spec/threatinator/plugin_loader_spec.rb +238 -0
  383. data/spec/threatinator/plugins/output/csv_spec.rb +47 -0
  384. data/spec/threatinator/plugins/output/null_spec.rb +17 -0
  385. data/spec/threatinator/plugins/output/rubydebug_spec.rb +37 -0
  386. data/spec/threatinator/record_spec.rb +19 -0
  387. data/spec/threatinator/registry_spec.rb +97 -0
  388. data/spec/threatinator/runner_spec.rb +273 -0
  389. metadata +674 -0
@@ -0,0 +1,3 @@
1
+ provider "provider1"
2
+ name "name1"
3
+ fetch_http('https://foobar/feed1.data')
@@ -0,0 +1,5 @@
1
+ name "feed1"
2
+ fetch_http('https://foobar/feed1.data')
3
+
4
+ parse_eachline(:separator => "\n") do |builder, line|
5
+ end
@@ -0,0 +1,31 @@
1
+ require 'threatinator/event'
2
+ require 'threatinator/event_builder'
3
+
4
+ FactoryGirl.define do
5
+ factory :event, class: Threatinator::Event do
6
+ feed_name 'my_feed_name'
7
+ feed_provider 'my_provider'
8
+ type :scanning
9
+ ipv4s { [ ] }
10
+ fqdns { [ ] }
11
+ urls { [ ] }
12
+
13
+ initialize_with {
14
+ builder = Threatinator::EventBuilder.new(feed_provider, feed_name)
15
+ builder.type = type
16
+
17
+ ipv4s.each do |ipv4|
18
+ builder.add_ipv4(ipv4)
19
+ end
20
+ fqdns.each do |fqdn|
21
+ builder.add_fqdn(fqdn)
22
+ end
23
+ urls.each do |url|
24
+ builder.add_url(url)
25
+ end
26
+ builder.build
27
+ }
28
+ end
29
+ end
30
+
31
+
@@ -0,0 +1,59 @@
1
+ require 'threatinator/feed'
2
+ require 'threatinator/parser'
3
+ require 'threatinator/fetcher'
4
+ require 'threatinator/fetchers/http'
5
+
6
+ FactoryGirl.define do
7
+ factory :feed, class: Threatinator::Feed do
8
+ sequence(:provider) { |n| "provider_#{n}" }
9
+ sequence(:name) { |n| "name_#{n}" }
10
+ fetcher_builder { lambda { Threatinator::Fetcher.new({}) } }
11
+ fetcher { nil }
12
+ parser_builder { lambda { Threatinator::Parser.new({}) } }
13
+ parser { nil }
14
+ filter_builders { [] }
15
+ filters { [] }
16
+ decoder_builders { [] }
17
+ decoders { [] }
18
+ parser_block { lambda { |*args| } }
19
+
20
+ initialize_with {
21
+ opts = attributes.to_hash
22
+ if fetcher = opts.delete(:fetcher)
23
+ opts[:fetcher_builder] = Proc.new { fetcher }
24
+ end
25
+ if decoders = opts.delete(:decoders)
26
+ decoders.each do |decoder|
27
+ opts[:decoder_builders] << Proc.new { decoder }
28
+ end
29
+ end
30
+ if filters = opts.delete(:filters)
31
+ filters.each do |filter|
32
+ if filter.kind_of?(::Proc)
33
+ filter = Threatinator::Filters::Block.new(filter)
34
+ end
35
+ fb = Proc.new { filter }
36
+ opts[:filter_builders] << fb
37
+ end
38
+ end
39
+ if parser = opts.delete(:parser)
40
+ opts[:parser_builder] = Proc.new { parser }
41
+ end
42
+ new(opts)
43
+ }
44
+
45
+ trait :http do
46
+ url { "https://foobar/#{provider}/#{name}.data" }
47
+ fetcher_builder { lambda { Threatinator::Fetchers::Http.new({url: url}) } }
48
+ end
49
+
50
+ trait :mini do
51
+ http
52
+ sequence(:url) { |n| "http://x#{n}" }
53
+ sequence(:provider) { |n| "x#{n}" }
54
+ sequence(:name) { |n| "x#{n}" }
55
+ end
56
+ end
57
+
58
+ end
59
+
@@ -0,0 +1,65 @@
1
+ require 'threatinator/feed_builder'
2
+
3
+ FactoryGirl.define do
4
+ factory :feed_builder, class: Threatinator::FeedBuilder do
5
+ initialize_with do
6
+ builder = new()
7
+ attributes.each_pair do |sym, val|
8
+ next if val.nil?
9
+ if val.kind_of?(::Proc)
10
+ builder.send(sym, &val)
11
+ else
12
+ builder.send(sym, val)
13
+ end
14
+ end
15
+ builder
16
+ end
17
+
18
+ trait :provider do
19
+ provider 'FakeSecureCo'
20
+ end
21
+
22
+ trait :name do
23
+ name 'MaliciousDataFeed'
24
+ end
25
+
26
+ trait :http do
27
+ fetch_http "http://foo.com/bar"
28
+ end
29
+
30
+ trait :parse_eachline do
31
+ parse_eachline { lambda { |line| } }
32
+ end
33
+
34
+ trait :without_provider do
35
+ name
36
+ parse_eachline
37
+ http
38
+ end
39
+
40
+ trait :without_name do
41
+ provider
42
+ parse_eachline
43
+ http
44
+ end
45
+
46
+ trait :without_parser do
47
+ name
48
+ provider
49
+ http
50
+ end
51
+
52
+ trait :without_fetcher do
53
+ name
54
+ provider
55
+ parse_eachline
56
+ end
57
+
58
+ trait :buildable do
59
+ name
60
+ provider
61
+ parse_eachline
62
+ http
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,8 @@
1
+ require 'threatinator/feed_registry'
2
+
3
+ FactoryGirl.define do
4
+ factory :feed_registry, class: Threatinator::FeedRegistry do
5
+ end
6
+ end
7
+
8
+
@@ -0,0 +1,36 @@
1
+ require 'threatinator/model/observables/ipv4'
2
+ require 'ip'
3
+
4
+ FactoryGirl.define do
5
+ factory :ipv4, class: Threatinator::Model::Observables::Ipv4 do
6
+ sequence(:ipv4) { |n| IP::V4.new(0xa000000 + n) } # Starts at 10.0.0.0
7
+
8
+ initialize_with do
9
+ opts = attributes.dup
10
+ if opts[:ipv4].is_a?(::String)
11
+ opts[:ipv4] = IP::V4.parse(opts[:ipv4])
12
+ end
13
+ new(opts)
14
+ end
15
+ end
16
+
17
+ factory :ipv4s, class: Threatinator::Model::Observables::Ipv4Collection do
18
+ values { [ ] }
19
+
20
+ initialize_with do
21
+ values = attributes[:values]
22
+
23
+ values.map! do |v|
24
+ if v.kind_of?(::String)
25
+ v = build(:ipv4, ipv4: v)
26
+ end
27
+ v
28
+ end
29
+
30
+ new(values)
31
+ end
32
+ end
33
+ end
34
+
35
+
36
+
@@ -0,0 +1,11 @@
1
+ require 'threatinator/output'
2
+
3
+ FactoryGirl.define do
4
+ sequence :output_name do |n|
5
+ name = "output_test#{n}"
6
+ name.to_sym
7
+ end
8
+ end
9
+
10
+
11
+
@@ -0,0 +1,17 @@
1
+ require 'threatinator/record'
2
+
3
+ FactoryGirl.define do
4
+ factory :record, class: Threatinator::Record do
5
+ data { "some data" }
6
+
7
+ line_number 1
8
+ pos_start 0
9
+ pos_end 9
10
+
11
+ initialize_with {
12
+ new(attributes[:data], attributes)
13
+ }
14
+ end
15
+ end
16
+
17
+
@@ -0,0 +1,34 @@
1
+ require 'threatinator/model/observables/url_collection'
2
+ require 'addressable/uri'
3
+ require 'ip'
4
+
5
+ FactoryGirl.define do
6
+ factory :url, class: ::Addressable::URI do
7
+ url nil
8
+
9
+ initialize_with do
10
+ ::Addressable::URI.parse(attributes[:url])
11
+ end
12
+ end
13
+
14
+ factory :urls, class: Threatinator::Model::Observables::UrlCollection do
15
+ values { [ ] }
16
+
17
+ initialize_with do
18
+ values = attributes[:values]
19
+
20
+ values.map! do |v|
21
+ if v.kind_of?(::String)
22
+ v = build(:url, url: v)
23
+ end
24
+ v
25
+ end
26
+
27
+ new(values)
28
+ end
29
+ end
30
+ end
31
+
32
+
33
+
34
+
@@ -0,0 +1,33 @@
1
+ require 'threatinator/parsers/xml/node'
2
+
3
+ FactoryGirl.define do
4
+ factory :xml_node, class: Threatinator::Parsers::XML::Node do
5
+ name { "foo" }
6
+ attrs { { } }
7
+ text { "" }
8
+ children { [] }
9
+
10
+ initialize_with {
11
+ new(name, attrs: attrs, text: text, children: children)
12
+ }
13
+
14
+ trait(:with_attrs) do
15
+ attrs { {
16
+ attr1: "val1",
17
+ attr2: "val2"
18
+ } }
19
+ end
20
+
21
+ trait(:with_children) do
22
+ children { [
23
+ build(:xml_node, name: "child1"),
24
+ build(:xml_node, name: "child2"),
25
+ build(:xml_node, name: "child3"),
26
+ ] }
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+
33
+
@@ -0,0 +1,11 @@
1
+ require 'stringio'
2
+ module IOHelpers
3
+ def temp_stdout
4
+ $stdout = StringIO.new
5
+ yield $stdout.string
6
+ return $stdout.string
7
+ ensure
8
+ $stdout = STDOUT
9
+ end
10
+ end
11
+
@@ -0,0 +1,13 @@
1
+ require 'threatinator/parser'
2
+ require 'threatinator/fetcher'
3
+
4
+ module FeedSpec
5
+ class Fetcher < Threatinator::Fetcher
6
+ def initialize(opts = {})
7
+ @io = opts[:io]
8
+ end
9
+ def fetch; @io; end
10
+ end
11
+ class Parser < Threatinator::Parser
12
+ end
13
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for "an action builder" do
4
+ # expects :builder
5
+ # expects :config_hash
6
+ describe "a call to #feed_registry" do
7
+ let(:feed_registry) { double('feed_registry') }
8
+ let(:feed_search_hash) { double('feed search hash') }
9
+ let(:feed_search) { double('feed_search') }
10
+
11
+ before :each do
12
+ allow(Threatinator::FeedRegistry).to receive(:build).and_return(feed_registry)
13
+ allow(Threatinator::Config::FeedSearch).to receive(:new).and_return(feed_search)
14
+ end
15
+
16
+
17
+ context "when config_hash['feed_search'] exists" do
18
+ before :each do
19
+ config_hash['feed_search'] = feed_search_hash
20
+ end
21
+
22
+ it "builds a new Threatinator::Config::FeedSearch using config_hash['feed_search']" do
23
+ expect(Threatinator::Config::FeedSearch).to receive(:new).with(feed_search_hash)
24
+ builder.feed_registry
25
+ end
26
+ end
27
+ context "when config_hash['feed_search'] does not exist" do
28
+ before :each do
29
+ config_hash.delete('feed_search')
30
+ end
31
+
32
+ it "builds a new Threatinator::Config::FeedSearch using an empty hash" do
33
+ expect(Threatinator::Config::FeedSearch).to receive(:new).with({})
34
+ builder.feed_registry
35
+ end
36
+ end
37
+
38
+ it "builds a new feed registry using the config" do
39
+ expect(Threatinator::FeedRegistry).to receive(:build).with(feed_search)
40
+ builder.feed_registry
41
+ end
42
+
43
+ it "returns the instance of Threatinator::FeedRegistry" do
44
+ expect(builder.feed_registry).to be(feed_registry)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'threatinator/exceptions'
4
+
5
+ shared_examples_for "a decoder" do
6
+ # Expects :encode_data_proc, :decoder_opts
7
+ let(:extra_opts) { { } }
8
+ let(:decoder) { described_class.new(decoder_opts.merge(extra_opts)) }
9
+
10
+ describe "an instance" do
11
+ subject { decoder }
12
+ it { is_expected.to respond_to(:decode) }
13
+
14
+ it "should close the IO that it decodes from" do
15
+ data = encode_data_proc.call("here's some data")
16
+ io = StringIO.new(data)
17
+ expect(io).not_to be_closed
18
+ decoder.decode(io)
19
+ expect(io).to be_closed
20
+ end
21
+
22
+ end
23
+
24
+ describe "decoding a UTF-8 string" do
25
+ let(:original_string) {
26
+ "\xE1\x9A\xA0\xE1\x9B\x87\xE1\x9A\xBB\xE1\x9B\xAB\xE1\x9B\x92\xE1\x9B\xA6\xE1\x9A\xA6\xE1\x9B\xAB\xE1\x9A\xA0\xE1\x9A\xB1\xE1\x9A\xA9\xE1\x9A\xA0\xE1\x9A\xA2\xE1\x9A\xB1\xE1\x9B\xAB\xE1\x9A\xA0\xE1\x9B\x81\xE1\x9A\xB1\xE1\x9A\xAA\xE1\x9B\xAB\xE1\x9A\xB7\xE1\x9B\x96\xE1\x9A\xBB\xE1\x9A\xB9\xE1\x9B\xA6\xE1\x9B\x9A\xE1\x9A\xB3\xE1\x9A\xA2\xE1\x9B\x97\n\xE1\x9B\x8B\xE1\x9A\xB3\xE1\x9B\x96\xE1\x9A\xAA\xE1\x9B\x9A\xE1\x9B\xAB\xE1\x9A\xA6\xE1\x9B\x96\xE1\x9A\xAA\xE1\x9A\xBB\xE1\x9B\xAB\xE1\x9B\x97\xE1\x9A\xAA\xE1\x9A\xBE\xE1\x9A\xBE\xE1\x9A\xAA\xE1\x9B\xAB\xE1\x9A\xB7\xE1\x9B\x96\xE1\x9A\xBB\xE1\x9A\xB9\xE1\x9B\xA6\xE1\x9B\x9A\xE1\x9A\xB3\xE1\x9B\xAB\xE1\x9B\x97\xE1\x9B\x81\xE1\x9A\xB3\xE1\x9B\x9A\xE1\x9A\xA2\xE1\x9A\xBE\xE1\x9B\xAB\xE1\x9A\xBB\xE1\x9B\xA6\xE1\x9B\x8F\xE1\x9B\xAB\xE1\x9B\x9E\xE1\x9A\xAB\xE1\x9B\x9A\xE1\x9A\xAA\xE1\x9A\xBE\n\xE1\x9A\xB7\xE1\x9B\x81\xE1\x9A\xA0\xE1\x9B\xAB\xE1\x9A\xBB\xE1\x9B\x96\xE1\x9B\xAB\xE1\x9A\xB9\xE1\x9B\x81\xE1\x9B\x9A\xE1\x9B\x96\xE1\x9B\xAB\xE1\x9A\xA0\xE1\x9A\xA9\xE1\x9A\xB1\xE1\x9B\xAB\xE1\x9B\x9E\xE1\x9A\xB1\xE1\x9B\x81\xE1\x9A\xBB\xE1\x9B\x8F\xE1\x9A\xBE\xE1\x9B\x96\xE1\x9B\xAB\xE1\x9B\x9E\xE1\x9A\xA9\xE1\x9B\x97\xE1\x9B\x96\xE1\x9B\x8B\xE1\x9B\xAB\xE1\x9A\xBB\xE1\x9B\x9A\xE1\x9B\x87\xE1\x9B\x8F\xE1\x9A\xAA\xE1\x9A\xBE\xE1\x9B\xAC\n"
27
+ .force_encoding("UTF-8")
28
+ }
29
+
30
+ let(:encoded_string) { encode_data_proc.call(original_string) }
31
+ let(:encoded_io) { StringIO.new(encoded_string) }
32
+
33
+ describe "the decoded data" do
34
+ it "should equal the original string" do
35
+ expect(decoder.decode(encoded_io).read()).to eq(original_string)
36
+ end
37
+ it "should be UTF-8 encoded" do
38
+ expect(decoder.decode(encoded_io).read().encoding).to eq(Encoding::UTF_8)
39
+ end
40
+ end
41
+ end
42
+
43
+ describe "decoding a UTF-8 string2" do
44
+ let(:original_string) {
45
+ "21826 | Corporación Telemic C.A.,VE | 200.75.105.49 | 2014-07-18 19:54:54 | sshpwauth".force_encoding("UTF-8")
46
+ }
47
+
48
+ let(:encoded_string) { encode_data_proc.call(original_string) }
49
+ let(:encoded_io) { StringIO.new(encoded_string) }
50
+
51
+ describe "the decoded data" do
52
+ it "should equal the original string" do
53
+ expect(decoder.decode(encoded_io).read()).to eq(original_string)
54
+ end
55
+ it "should be UTF-8 encoded" do
56
+ expect(decoder.decode(encoded_io).read().encoding).to eq(Encoding::UTF_8)
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ shared_examples_for "a decoder encountering an error during decoding" do
63
+ # Expects :decoder, :input_io
64
+ it "#decode should raise a DecoderError" do
65
+ expect {
66
+ decoder.decode(input_io)
67
+ }.to raise_error(Threatinator::Exceptions::DecoderError)
68
+ end
69
+ end
70
+
@@ -0,0 +1,136 @@
1
+ require 'spec_helper'
2
+ require 'threatinator/feed_runner'
3
+
4
+ shared_examples_for "a FeedRunner observer" do
5
+ describe "#update(:start)" do
6
+ after :each do
7
+ observer.update(:end)
8
+ end
9
+ it "does not raise any errors when handling a :start event" do
10
+ expect {
11
+ observer.update(:start)
12
+ }.not_to raise_error
13
+ end
14
+ end
15
+
16
+ describe "#update(:end)" do
17
+ before :each do
18
+ observer.update(:start)
19
+ end
20
+
21
+ it "does not raise any errors when handling an :end event" do
22
+ expect {
23
+ observer.update(:end)
24
+ }.not_to raise_error
25
+ end
26
+ end
27
+
28
+ context "once started" do
29
+ before :each do
30
+ observer.update(:start)
31
+ end
32
+
33
+ after :each do
34
+ observer.update(:end)
35
+ end
36
+
37
+ let(:record) { build(:record, line_number: 23, pos_start: 99, pos_end: 105, data: "foobar\r\n") }
38
+
39
+ describe "#update(:start_fetch)" do
40
+ it "does not raise any errors when handling an :start_fetch event" do
41
+ expect {
42
+ observer.update(:start_fetch)
43
+ }.not_to raise_error
44
+ end
45
+ end
46
+
47
+ describe "#update(:end_fetch)" do
48
+ it "does not raise any errors when handling an :end_fetch event" do
49
+ expect {
50
+ observer.update(:end_fetch)
51
+ }.not_to raise_error
52
+ end
53
+ end
54
+
55
+ describe "#update(:start_decode)" do
56
+ it "does not raise any errors when handling an :start_decode event" do
57
+ expect {
58
+ observer.update(:start_decode)
59
+ }.not_to raise_error
60
+ end
61
+ end
62
+
63
+ describe "#update(:end_decode)" do
64
+ it "does not raise any errors when handling an :end_decode event" do
65
+ expect {
66
+ observer.update(:end_decode)
67
+ }.not_to raise_error
68
+ end
69
+ end
70
+
71
+ describe "#update(:start_parse_record, record)" do
72
+ it "does not raise any errors when handling an :start_parse_record event" do
73
+ expect {
74
+ observer.update(:start_parse_record, record)
75
+ }.not_to raise_error
76
+ end
77
+ end
78
+
79
+ describe "#update(:end_parse_record, record)" do
80
+ it "does not raise any errors when handling an :end_parse_record event" do
81
+ expect {
82
+ observer.update(:end_parse_record, record)
83
+ }.not_to raise_error
84
+ end
85
+ end
86
+
87
+ describe "#update(:record_filtered, record)" do
88
+ it "does not raise any errors when handling a :record_filtered event" do
89
+ expect {
90
+ observer.update(:record_filtered, record)
91
+ }.not_to raise_error
92
+ end
93
+ end
94
+
95
+ describe "#update(:record_missed, record)" do
96
+ it "does not raise any errors when handling a :record_missed event" do
97
+ expect {
98
+ observer.update(:record_missed, record)
99
+ }.not_to raise_error
100
+ end
101
+ end
102
+
103
+ describe "#update(:record_parsed, record, events)" do
104
+ it "does not raise any errors when handling a :record_parsed event" do
105
+ expect {
106
+ observer.update(:record_missed, record, [build(:event)])
107
+ }.not_to raise_error
108
+ end
109
+ end
110
+
111
+ describe "#update(:record_error, record, array_of_errors)" do
112
+ it "does not raise any errors when handling a :record_error event" do
113
+ errors = [
114
+ Threatinator::Exceptions::EventBuildError.new("error 1"),
115
+ Threatinator::Exceptions::EventBuildError.new("error 2"),
116
+ Threatinator::Exceptions::EventBuildError.new("error 3")
117
+ ]
118
+ expect {
119
+ observer.update(:record_missed, record, errors)
120
+ }.not_to raise_error
121
+ end
122
+ end
123
+
124
+ it "does not raise any errors when handling unknown messages" do
125
+ expect {
126
+ observer.update(:flibby_floo, record)
127
+ }.not_to raise_error
128
+ end
129
+
130
+ it "does not raise any errors when handling extra arguments" do
131
+ expect {
132
+ observer.update(:flibby_floo, record, 1, 2, 3, 4)
133
+ }.not_to raise_error
134
+ end
135
+ end
136
+ end