arachni 1.2.1 → 1.3

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 (373) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/Gemfile +1 -1
  4. data/README.md +16 -5
  5. data/components/checks/active/ldap_injection/errors.txt +1 -0
  6. data/components/checks/active/source_code_disclosure.rb +1 -1
  7. data/components/checks/active/unvalidated_redirect.rb +6 -6
  8. data/components/checks/active/unvalidated_redirect_dom.rb +10 -7
  9. data/components/checks/passive/grep/captcha.rb +14 -5
  10. data/components/checks/passive/grep/form_upload.rb +7 -3
  11. data/components/checks/passive/grep/hsts.rb +3 -3
  12. data/components/checks/passive/grep/html_objects.rb +2 -3
  13. data/components/checks/passive/grep/http_only_cookies.rb +2 -3
  14. data/components/checks/passive/grep/insecure_cookies.rb +1 -1
  15. data/components/checks/passive/grep/password_autocomplete.rb +2 -2
  16. data/components/checks/passive/grep/unencrypted_password_forms.rb +7 -7
  17. data/components/checks/passive/grep/x_frame_options.rb +2 -2
  18. data/components/checks/passive/http_put.rb +2 -3
  19. data/components/path_extractors/comments.rb +3 -3
  20. data/components/path_extractors/scripts.rb +10 -1
  21. data/components/plugins/defaults/autothrottle.rb +27 -18
  22. data/components/plugins/defaults/meta/remedies/discovery.rb +30 -33
  23. data/components/plugins/defaults/meta/remedies/timing_attacks.rb +7 -11
  24. data/components/plugins/login_script.rb +9 -3
  25. data/components/plugins/proxy.rb +4 -3
  26. data/components/reporters/html.rb +11 -14
  27. data/components/reporters/html/default/issue.erb +13 -38
  28. data/components/reporters/html/default/issue/info.erb +1 -1
  29. data/components/reporters/html/default/summary/issues/by_name.erb +3 -3
  30. data/components/reporters/stdout.rb +62 -71
  31. data/components/reporters/xml.rb +26 -40
  32. data/components/reporters/xml/schema.xsd +43 -89
  33. data/lib/arachni/browser.rb +52 -3
  34. data/lib/arachni/browser/javascript.rb +3 -3
  35. data/lib/arachni/browser/javascript/scripts/taint_tracer.js +46 -25
  36. data/lib/arachni/browser_cluster.rb +61 -0
  37. data/lib/arachni/browser_cluster/job.rb +21 -1
  38. data/lib/arachni/browser_cluster/jobs/browser_provider.rb +3 -1
  39. data/lib/arachni/browser_cluster/jobs/resource_exploration.rb +2 -1
  40. data/lib/arachni/browser_cluster/jobs/resource_exploration/event_trigger.rb +2 -1
  41. data/lib/arachni/browser_cluster/jobs/taint_trace.rb +3 -2
  42. data/lib/arachni/browser_cluster/jobs/taint_trace/event_trigger.rb +1 -1
  43. data/lib/arachni/browser_cluster/worker.rb +5 -0
  44. data/lib/arachni/check/auditor.rb +22 -12
  45. data/lib/arachni/data/framework.rb +13 -1
  46. data/lib/arachni/data/issues.rb +9 -25
  47. data/lib/arachni/element/base.rb +9 -3
  48. data/lib/arachni/element/capabilities/analyzable.rb +2 -6
  49. data/lib/arachni/element/capabilities/analyzable/differential.rb +24 -7
  50. data/lib/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +23 -23
  51. data/lib/arachni/element/capabilities/auditable.rb +0 -6
  52. data/lib/arachni/element/capabilities/dom_only.rb +61 -0
  53. data/lib/arachni/element/capabilities/with_dom.rb +3 -1
  54. data/lib/arachni/element/cookie.rb +35 -5
  55. data/lib/arachni/element/cookie/dom.rb +13 -4
  56. data/lib/arachni/element/{capabilities/auditable/dom.rb → dom.rb} +20 -68
  57. data/lib/arachni/element/dom/capabilities/auditable.rb +29 -0
  58. data/lib/arachni/element/dom/capabilities/inputtable.rb +27 -0
  59. data/lib/arachni/element/dom/capabilities/mutable.rb +21 -0
  60. data/lib/arachni/element/dom/capabilities/submittable.rb +52 -0
  61. data/lib/arachni/element/form.rb +12 -1
  62. data/lib/arachni/element/form/capabilities/mutable.rb +2 -1
  63. data/lib/arachni/element/form/capabilities/with_dom.rb +0 -1
  64. data/lib/arachni/element/form/dom.rb +9 -3
  65. data/lib/arachni/element/header.rb +14 -33
  66. data/lib/arachni/element/header/capabilities/inputtable.rb +29 -0
  67. data/lib/arachni/element/header/capabilities/mutable.rb +51 -0
  68. data/lib/arachni/element/input/dom.rb +71 -0
  69. data/lib/arachni/element/json.rb +2 -0
  70. data/lib/arachni/element/link.rb +3 -0
  71. data/lib/arachni/element/link/capabilities/with_dom.rb +0 -1
  72. data/lib/arachni/element/link/dom.rb +16 -3
  73. data/lib/arachni/element/link/dom/capabilities/submittable.rb +29 -0
  74. data/lib/arachni/element/link_template.rb +3 -5
  75. data/lib/arachni/element/link_template/capabilities/inputtable.rb +5 -0
  76. data/lib/arachni/element/link_template/capabilities/with_dom.rb +0 -1
  77. data/lib/arachni/element/link_template/dom.rb +16 -3
  78. data/lib/arachni/element/link_template/dom/capabilities/submittable.rb +29 -0
  79. data/lib/arachni/element/server.rb +3 -5
  80. data/lib/arachni/element/ui_form.rb +106 -0
  81. data/lib/arachni/element/ui_form/dom.rb +107 -0
  82. data/lib/arachni/element/ui_input.rb +62 -0
  83. data/lib/arachni/element/xml.rb +2 -1
  84. data/lib/arachni/framework.rb +7 -5
  85. data/lib/arachni/framework/parts/audit.rb +0 -1
  86. data/lib/arachni/framework/parts/check.rb +1 -0
  87. data/lib/arachni/framework/parts/data.rb +4 -0
  88. data/lib/arachni/framework/parts/state.rb +0 -2
  89. data/lib/arachni/http/client.rb +17 -6
  90. data/lib/arachni/http/proxy_server.rb +52 -5
  91. data/lib/arachni/http/request.rb +1 -1
  92. data/lib/arachni/issue.rb +34 -179
  93. data/lib/arachni/issue/severity.rb +2 -0
  94. data/lib/arachni/option_groups/audit.rb +22 -2
  95. data/lib/arachni/option_groups/browser_cluster.rb +15 -0
  96. data/lib/arachni/page.rb +3 -2
  97. data/lib/arachni/parser.rb +24 -5
  98. data/lib/arachni/platform/manager.rb +1 -2
  99. data/lib/arachni/rpc/server/framework.rb +3 -4
  100. data/lib/arachni/rpc/server/framework/multi_instance.rb +2 -1
  101. data/lib/arachni/session.rb +1 -1
  102. data/lib/arachni/trainer.rb +4 -7
  103. data/lib/arachni/watir/element.rb +12 -1
  104. data/lib/version +1 -1
  105. data/spec/arachni/browser/element_locator_spec.rb +43 -43
  106. data/spec/arachni/browser/javascript/dom_monitor_spec.rb +44 -44
  107. data/spec/arachni/browser/javascript/proxy/stub_spec.rb +17 -14
  108. data/spec/arachni/browser/javascript/proxy_spec.rb +24 -24
  109. data/spec/arachni/browser/javascript/taint_tracer/frame/called_function_spec.rb +11 -11
  110. data/spec/arachni/browser/javascript/taint_tracer/frame_spec.rb +7 -7
  111. data/spec/arachni/browser/javascript/taint_tracer/sink/data_flow_spec.rb +13 -13
  112. data/spec/arachni/browser/javascript/taint_tracer/sink/execution_flow_spec.rb +7 -7
  113. data/spec/arachni/browser/javascript/taint_tracer_spec.rb +568 -558
  114. data/spec/arachni/browser/javascript_spec.rb +73 -63
  115. data/spec/arachni/browser_cluster/job/result_spec.rb +3 -3
  116. data/spec/arachni/browser_cluster/job_spec.rb +68 -48
  117. data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger/result_spec.rb +2 -2
  118. data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger_spec.rb +5 -4
  119. data/spec/arachni/browser_cluster/jobs/resource_exploration/result_spec.rb +2 -2
  120. data/spec/arachni/browser_cluster/jobs/resource_exploration_spec.rb +5 -5
  121. data/spec/arachni/browser_cluster/worker_spec.rb +87 -70
  122. data/spec/arachni/browser_cluster_spec.rb +64 -39
  123. data/spec/arachni/browser_spec.rb +692 -527
  124. data/spec/arachni/check/auditor_spec.rb +177 -147
  125. data/spec/arachni/check/base_spec.rb +33 -33
  126. data/spec/arachni/check/manager_spec.rb +15 -15
  127. data/spec/arachni/component/base_spec.rb +8 -8
  128. data/spec/arachni/component/manager_spec.rb +100 -99
  129. data/spec/arachni/component/options/address_spec.rb +3 -3
  130. data/spec/arachni/component/options/base_spec.rb +7 -7
  131. data/spec/arachni/component/options/bool_spec.rb +9 -9
  132. data/spec/arachni/component/options/float_spec.rb +6 -6
  133. data/spec/arachni/component/options/int_spec.rb +5 -5
  134. data/spec/arachni/component/options/multiple_choice_spec.rb +12 -12
  135. data/spec/arachni/component/options/object_spec.rb +2 -2
  136. data/spec/arachni/component/options/path_spec.rb +3 -3
  137. data/spec/arachni/component/options/port_spec.rb +5 -5
  138. data/spec/arachni/component/options/string_spec.rb +3 -3
  139. data/spec/arachni/component/options/url_spec.rb +4 -4
  140. data/spec/arachni/component/utilities_spec.rb +2 -2
  141. data/spec/arachni/data/framework/rpc_spec.rb +10 -9
  142. data/spec/arachni/data/framework_spec.rb +65 -46
  143. data/spec/arachni/data/issues_spec.rb +39 -77
  144. data/spec/arachni/data/plugins_spec.rb +11 -11
  145. data/spec/arachni/data/session_spec.rb +6 -6
  146. data/spec/arachni/data_spec.rb +8 -8
  147. data/spec/arachni/element/body_spec.rb +10 -10
  148. data/spec/arachni/element/capabilities/analyzable/differential_spec.rb +39 -21
  149. data/spec/arachni/element/capabilities/analyzable/{taint_spec.rb → signature_spec.rb} +63 -63
  150. data/spec/arachni/element/capabilities/analyzable/timeout_spec.rb +51 -51
  151. data/spec/arachni/element/capabilities/with_scope/scope_spec.rb +5 -5
  152. data/spec/arachni/element/cookie/dom_spec.rb +37 -18
  153. data/spec/arachni/element/cookie_spec.rb +206 -139
  154. data/spec/arachni/element/form/dom_spec.rb +36 -19
  155. data/spec/arachni/element/form_spec.rb +210 -187
  156. data/spec/arachni/element/generic_dom_spec.rb +14 -14
  157. data/spec/arachni/element/header_spec.rb +35 -17
  158. data/spec/arachni/element/json_spec.rb +53 -31
  159. data/spec/arachni/element/link/dom_spec.rb +46 -28
  160. data/spec/arachni/element/link_spec.rb +58 -40
  161. data/spec/arachni/element/link_template/dom_spec.rb +47 -29
  162. data/spec/arachni/element/link_template_spec.rb +79 -61
  163. data/spec/arachni/element/path_spec.rb +1 -1
  164. data/spec/arachni/element/server_spec.rb +33 -32
  165. data/spec/arachni/element/ui_form/ui_form_dom_spec.rb +164 -0
  166. data/spec/arachni/element/ui_form_spec.rb +242 -0
  167. data/spec/arachni/element/ui_input/dom_spec.rb +157 -0
  168. data/spec/arachni/element/ui_input_spec.rb +136 -0
  169. data/spec/arachni/element/xml_spec.rb +42 -24
  170. data/spec/arachni/element_filter_spec.rb +49 -48
  171. data/spec/arachni/error_spec.rb +3 -3
  172. data/spec/arachni/framework/parts/audit_spec.rb +64 -63
  173. data/spec/arachni/framework/parts/browser_spec.rb +16 -16
  174. data/spec/arachni/framework/parts/check_spec.rb +3 -3
  175. data/spec/arachni/framework/parts/data_spec.rb +48 -48
  176. data/spec/arachni/framework/parts/platform_spec.rb +3 -3
  177. data/spec/arachni/framework/parts/plugin_spec.rb +7 -6
  178. data/spec/arachni/framework/parts/report_spec.rb +7 -7
  179. data/spec/arachni/framework/parts/scope_spec.rb +16 -16
  180. data/spec/arachni/framework/parts/state_spec.rb +68 -69
  181. data/spec/arachni/framework_spec.rb +39 -31
  182. data/spec/arachni/http/client/dynamic_404_handlers_spec.rb +32 -32
  183. data/spec/arachni/http/client_spec.rb +219 -208
  184. data/spec/arachni/http/cookie_jar_spec.rb +72 -72
  185. data/spec/arachni/http/headers_spec.rb +14 -14
  186. data/spec/arachni/http/proxy_server_spec.rb +43 -42
  187. data/spec/arachni/http/request_spec.rb +105 -103
  188. data/spec/arachni/http/response/scope_spec.rb +24 -24
  189. data/spec/arachni/http/response_spec.rb +50 -49
  190. data/spec/arachni/issue/severity_spec.rb +10 -9
  191. data/spec/arachni/issue_spec.rb +71 -369
  192. data/spec/arachni/option_groups/audit_spec.rb +114 -114
  193. data/spec/arachni/option_groups/browser_cluster_spec.rb +20 -3
  194. data/spec/arachni/option_groups/datastore_spec.rb +6 -6
  195. data/spec/arachni/option_groups/dispatcher_spec.rb +19 -19
  196. data/spec/arachni/option_groups/http_spec.rb +11 -11
  197. data/spec/arachni/option_groups/input_spec.rb +31 -27
  198. data/spec/arachni/option_groups/output_spec.rb +2 -2
  199. data/spec/arachni/option_groups/paths_spec.rb +17 -17
  200. data/spec/arachni/option_groups/rpc_spec.rb +2 -2
  201. data/spec/arachni/option_groups/scope_spec.rb +40 -40
  202. data/spec/arachni/option_groups/session_spec.rb +6 -5
  203. data/spec/arachni/option_groups/snapshot_spec.rb +4 -4
  204. data/spec/arachni/options_spec.rb +46 -45
  205. data/spec/arachni/page/dom/transition_spec.rb +74 -72
  206. data/spec/arachni/page/dom_spec.rb +35 -35
  207. data/spec/arachni/page/scope_spec.rb +15 -15
  208. data/spec/arachni/page_spec.rb +217 -217
  209. data/spec/arachni/parser_spec.rb +106 -104
  210. data/spec/arachni/platform/fingerprinter_spec.rb +17 -14
  211. data/spec/arachni/platform/list_spec.rb +33 -33
  212. data/spec/arachni/platform/manager_spec.rb +67 -64
  213. data/spec/arachni/plugin/base_spec.rb +10 -10
  214. data/spec/arachni/plugin/manager_spec.rb +38 -37
  215. data/spec/arachni/report_spec.rb +43 -40
  216. data/spec/arachni/reporter/base_spec.rb +15 -15
  217. data/spec/arachni/reporter/manager_spec.rb +4 -4
  218. data/spec/arachni/reporter/options_spec.rb +6 -6
  219. data/spec/arachni/rpc/client/base_spec.rb +6 -6
  220. data/spec/arachni/rpc/client/dispatcher_spec.rb +2 -2
  221. data/spec/arachni/rpc/client/instance_spec.rb +6 -6
  222. data/spec/arachni/rpc/server/active_options_spec.rb +11 -8
  223. data/spec/arachni/rpc/server/base_spec.rb +5 -5
  224. data/spec/arachni/rpc/server/checks/manager_spec.rb +8 -8
  225. data/spec/arachni/rpc/server/dispatcher/node_spec.rb +37 -37
  226. data/spec/arachni/rpc/server/dispatcher/service_spec.rb +15 -14
  227. data/spec/arachni/rpc/server/dispatcher_spec.rb +36 -35
  228. data/spec/arachni/rpc/server/framework/distributor_spec.rb +36 -36
  229. data/spec/arachni/rpc/server/framework_multi_spec.rb +340 -336
  230. data/spec/arachni/rpc/server/framework_spec.rb +90 -85
  231. data/spec/arachni/rpc/server/instance_spec.rb +126 -107
  232. data/spec/arachni/rpc/server/output_spec.rb +1 -1
  233. data/spec/arachni/rpc/server/plugin/manager_spec.rb +6 -6
  234. data/spec/arachni/ruby/array_spec.rb +42 -42
  235. data/spec/arachni/ruby/hash_spec.rb +20 -18
  236. data/spec/arachni/ruby/io_spec.rb +2 -2
  237. data/spec/arachni/ruby/object_spec.rb +1 -1
  238. data/spec/arachni/ruby/set_spec.rb +3 -3
  239. data/spec/arachni/ruby/string_spec.rb +30 -30
  240. data/spec/arachni/ruby/webrick_spec.rb +2 -2
  241. data/spec/arachni/scope_spec.rb +1 -1
  242. data/spec/arachni/session_spec.rb +67 -64
  243. data/spec/arachni/snapshot_spec.rb +15 -15
  244. data/spec/arachni/state/audit_spec.rb +11 -11
  245. data/spec/arachni/state/element_filter_spec.rb +6 -6
  246. data/spec/arachni/state/framework/rpc_spec.rb +12 -12
  247. data/spec/arachni/state/framework_spec.rb +125 -121
  248. data/spec/arachni/state/http_spec.rb +7 -7
  249. data/spec/arachni/state/options_spec.rb +7 -7
  250. data/spec/arachni/state/plugins_spec.rb +8 -8
  251. data/spec/arachni/state_spec.rb +10 -10
  252. data/spec/arachni/support/buffer/autoflush_spec.rb +16 -16
  253. data/spec/arachni/support/buffer/base_spec.rb +39 -39
  254. data/spec/arachni/support/cache/least_cost_replacement_spec.rb +18 -18
  255. data/spec/arachni/support/cache/least_recently_pushed_spec.rb +24 -24
  256. data/spec/arachni/support/cache/least_recently_used_spec.rb +20 -20
  257. data/spec/arachni/support/cache/preference_spec.rb +4 -4
  258. data/spec/arachni/support/cache/random_replacement_spec.rb +8 -8
  259. data/spec/arachni/support/crypto/rsa_aes_cbc_spec.rb +1 -1
  260. data/spec/arachni/support/database/hash_spec.rb +44 -43
  261. data/spec/arachni/support/database/queue_spec.rb +27 -27
  262. data/spec/arachni/support/lookup/hash_set_spec.rb +8 -8
  263. data/spec/arachni/support/lookup/moolb_spec.rb +3 -3
  264. data/spec/arachni/support/mixins/observable_spec.rb +6 -6
  265. data/spec/arachni/support/signature_spec.rb +19 -19
  266. data/spec/arachni/trainer_spec.rb +39 -39
  267. data/spec/arachni/typhoeus/hydra_spec.rb +2 -2
  268. data/spec/arachni/uri/scope_spec.rb +66 -66
  269. data/spec/arachni/uri_spec.rb +107 -105
  270. data/spec/arachni/utilities_spec.rb +40 -40
  271. data/spec/components/checks/active/csrf_spec.rb +8 -8
  272. data/spec/components/checks/active/no_sql_injection_spec.rb +1 -1
  273. data/spec/components/checks/active/sql_injection_spec.rb +16 -16
  274. data/spec/components/checks/active/trainer_spec.rb +4 -4
  275. data/spec/components/checks/active/unvalidated_redirect_dom_spec.rb +4 -2
  276. data/spec/components/checks/active/xpath_injection_spec.rb +1 -1
  277. data/spec/components/checks/active/xss_dom_script_context_spec.rb +51 -21
  278. data/spec/components/checks/active/xss_dom_spec.rb +46 -24
  279. data/spec/components/checks/passive/allowed_methods_spec.rb +1 -1
  280. data/spec/components/checks/passive/grep/cookie_set_for_parent_domain_spec.rb +1 -1
  281. data/spec/components/checks/passive/grep/hsts_spec.rb +2 -2
  282. data/spec/components/checks/passive/grep/http_only_cookies_spec.rb +1 -1
  283. data/spec/components/checks/passive/grep/insecure_cookies_spec.rb +1 -1
  284. data/spec/components/checks/passive/grep/insecure_cors_policy_spec.rb +2 -2
  285. data/spec/components/checks/passive/grep/password_autocomplete_spec.rb +1 -1
  286. data/spec/components/checks/passive/grep/private_ip_spec.rb +3 -3
  287. data/spec/components/checks/passive/grep/unencrypted_password_forms_spec.rb +1 -1
  288. data/spec/components/checks/passive/grep/x_frame_options_spec.rb +2 -2
  289. data/spec/components/checks/passive/interesting_responses_spec.rb +2 -2
  290. data/spec/components/checks/passive/webdav_spec.rb +1 -1
  291. data/spec/components/checks/passive/xst_spec.rb +1 -1
  292. data/spec/components/fingerprinters/servers/apache_spec.rb +2 -2
  293. data/spec/components/path_extractors/comments_spec.rb +5 -1
  294. data/spec/components/path_extractors/scripts_spec.rb +5 -2
  295. data/spec/components/plugins/autologin_spec.rb +22 -22
  296. data/spec/components/plugins/autothrottle_spec.rb +6 -5
  297. data/spec/components/plugins/content_types_spec.rb +4 -4
  298. data/spec/components/plugins/cookie_collector_spec.rb +5 -5
  299. data/spec/components/plugins/exec_spec.rb +12 -12
  300. data/spec/components/plugins/form_dicattack_spec.rb +3 -3
  301. data/spec/components/plugins/headers_collector_spec.rb +8 -8
  302. data/spec/components/plugins/healthmap_spec.rb +3 -3
  303. data/spec/components/plugins/http_dicattack_spec.rb +3 -3
  304. data/spec/components/plugins/login_script_spec.rb +79 -22
  305. data/spec/components/plugins/meta/remedies/discovery_spec.rb +3 -2
  306. data/spec/components/plugins/meta/remedies/timing_attacks_spec.rb +3 -3
  307. data/spec/components/plugins/meta/uniformity_spec.rb +2 -2
  308. data/spec/components/plugins/restrict_to_dom_state_spec.rb +1 -1
  309. data/spec/components/plugins/script_spec.rb +1 -1
  310. data/spec/components/plugins/uncommon_headers_spec.rb +2 -2
  311. data/spec/components/plugins/vector_collector_spec.rb +2 -2
  312. data/spec/components/plugins/vector_feed_spec.rb +40 -40
  313. data/spec/components/plugins/waf_detector_spec.rb +6 -6
  314. data/spec/components/reporters/json_spec.rb +4 -4
  315. data/spec/components/reporters/marshal_spec.rb +2 -2
  316. data/spec/components/reporters/yaml_spec.rb +3 -2
  317. data/spec/external/wavsep/active/sqli_spec.rb +1 -3
  318. data/spec/spec_helper.rb +4 -0
  319. data/spec/support/factories/element/ui_form.rb +14 -0
  320. data/spec/support/factories/element/ui_input.rb +13 -0
  321. data/spec/support/factories/issue.rb +0 -13
  322. data/spec/support/fixtures/report.afr +0 -0
  323. data/spec/support/fixtures/{taint_check/taint.rb → signature_check/signature.rb} +2 -2
  324. data/spec/support/helpers/browser_cluster/jobs/taint_tracer.rb +11 -11
  325. data/spec/support/helpers/framework.rb +1 -1
  326. data/spec/support/helpers/pages.rb +2 -2
  327. data/spec/support/servers/arachni/browser.rb +139 -0
  328. data/spec/support/servers/arachni/browser/javascript/taint_tracer.rb +40 -0
  329. data/spec/support/servers/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +0 -0
  330. data/spec/support/servers/arachni/element/input/input_dom.rb +102 -0
  331. data/spec/support/servers/arachni/element/ui_form/ui_form_dom.rb +238 -0
  332. data/spec/support/servers/checks/active/trainer_check.rb +7 -7
  333. data/spec/support/servers/checks/active/unvalidated_redirect_dom.rb +22 -6
  334. data/spec/support/servers/checks/active/xss_dom.rb +50 -0
  335. data/spec/support/servers/checks/active/xss_dom_script_context.rb +53 -0
  336. data/spec/support/shared/browser/javascript/taint_tracer/sink/base.rb +6 -6
  337. data/spec/support/shared/check.rb +10 -12
  338. data/spec/support/shared/component/options/base.rb +24 -24
  339. data/spec/support/shared/element/base.rb +25 -25
  340. data/spec/support/shared/element/capabilities/auditable.rb +116 -140
  341. data/spec/support/shared/element/capabilities/dom_only.rb +65 -0
  342. data/spec/support/shared/element/capabilities/inputtable.rb +71 -86
  343. data/spec/support/shared/element/capabilities/mutable.rb +122 -111
  344. data/spec/support/shared/element/capabilities/refreshable.rb +10 -10
  345. data/spec/support/shared/element/capabilities/{submitable.rb → submittable.rb} +26 -26
  346. data/spec/support/shared/element/capabilities/with_auditor.rb +10 -10
  347. data/spec/support/shared/element/capabilities/with_dom.rb +8 -8
  348. data/spec/support/shared/element/capabilities/with_node.rb +4 -6
  349. data/spec/support/shared/element/capabilities/with_scope.rb +2 -2
  350. data/spec/support/shared/element/capabilities/with_source.rb +6 -8
  351. data/spec/support/shared/element/dom.rb +144 -0
  352. data/spec/support/shared/element/dom/auditable.rb +42 -0
  353. data/spec/support/shared/element/dom/inputtable.rb +5 -0
  354. data/spec/support/shared/element/dom/mutable.rb +3 -0
  355. data/spec/support/shared/element/dom/submittable.rb +119 -0
  356. data/spec/support/shared/external/wavsep.rb +3 -3
  357. data/spec/support/shared/fingerprinter.rb +2 -2
  358. data/spec/support/shared/framework.rb +1 -1
  359. data/spec/support/shared/http/message.rb +9 -9
  360. data/spec/support/shared/option_group.rb +17 -17
  361. data/spec/support/shared/path_extractor.rb +1 -1
  362. data/spec/support/shared/plugin.rb +2 -2
  363. data/spec/support/shared/support/cache.rb +57 -57
  364. data/spec/support/shared/support/lookup.rb +25 -25
  365. data/ui/cli/framework.rb +22 -11
  366. data/ui/cli/framework/option_parser.rb +15 -0
  367. data/ui/cli/option_parser.rb +8 -1
  368. data/ui/cli/output.rb +2 -1
  369. metadata +54 -20
  370. data/components/checks/active/xss_dom_inputs.rb +0 -236
  371. data/spec/components/checks/active/xss_dom_inputs_spec.rb +0 -30
  372. data/spec/support/servers/checks/active/xss_dom_inputs.rb +0 -59
  373. data/spec/support/shared/element/capabilities/auditable/dom.rb +0 -322
@@ -10,12 +10,12 @@ describe Arachni::Support::Cache::LeastCostReplacement do
10
10
  subject.store( :k2, '2', :high )
11
11
  subject.store( :k3, '3', :medium )
12
12
  subject.store( :k4, '4', :low )
13
- subject.size.should == 3
13
+ expect(subject.size).to eq(3)
14
14
 
15
- subject[:k4].should be_true
16
- subject[:k3].should be_nil
17
- subject[:k2].should be_true
18
- subject[:k].should be_true
15
+ expect(subject[:k4]).to be_truthy
16
+ expect(subject[:k3]).to be_nil
17
+ expect(subject[:k2]).to be_truthy
18
+ expect(subject[:k]).to be_truthy
19
19
 
20
20
  subject.clear
21
21
 
@@ -25,37 +25,37 @@ describe Arachni::Support::Cache::LeastCostReplacement do
25
25
  subject.store( :k2, '2', :low )
26
26
  subject.store( :k3, '3', :low )
27
27
  subject.store( :k4, '4', :low )
28
- subject.size.should == 1
28
+ expect(subject.size).to eq(1)
29
29
 
30
- subject[:k4].should be_true
31
- subject[:k3].should be_nil
32
- subject[:k2].should be_nil
33
- subject[:k].should be_nil
30
+ expect(subject[:k4]).to be_truthy
31
+ expect(subject[:k3]).to be_nil
32
+ expect(subject[:k2]).to be_nil
33
+ expect(subject[:k]).to be_nil
34
34
  end
35
35
 
36
36
  describe '#store' do
37
37
  it 'stores an object by key' do
38
38
  v = 'val'
39
- subject.store( :key, v, :low ).should == v
40
- subject[:key].should == v
39
+ expect(subject.store( :key, v, :low )).to eq(v)
40
+ expect(subject[:key]).to eq(v)
41
41
  end
42
42
  it 'assigns cost to object' do
43
43
  v = 'val'
44
- subject.store( :key, v, :low ).should == v
45
- subject[:key].should == v
44
+ expect(subject.store( :key, v, :low )).to eq(v)
45
+ expect(subject[:key]).to eq(v)
46
46
  end
47
47
  end
48
48
 
49
49
  describe '#[]=' do
50
50
  it 'stores an object' do
51
51
  v = 'val'
52
- (subject[:key] = v).should == v
53
- subject[:key].should == v
52
+ expect(subject[:key] = v).to eq(v)
53
+ expect(subject[:key]).to eq(v)
54
54
  end
55
55
  it 'alias of #store' do
56
56
  v = 'val2'
57
- subject.store( :key2, v ).should == v
58
- subject[:key2].should == v
57
+ expect(subject.store( :key2, v )).to eq(v)
58
+ expect(subject[:key2]).to eq(v)
59
59
  end
60
60
  end
61
61
  end
@@ -10,12 +10,12 @@ describe Arachni::Support::Cache::LeastRecentlyPushed do
10
10
  subject[:k2] = '2'
11
11
  subject[:k3] = '3'
12
12
  subject[:k4] = '4'
13
- subject.size.should == 3
13
+ expect(subject.size).to eq(3)
14
14
 
15
- subject[:k4].should be_true
16
- subject[:k3].should be_true
17
- subject[:k2].should be_true
18
- subject[:k].should be_nil
15
+ expect(subject[:k4]).to be_truthy
16
+ expect(subject[:k3]).to be_truthy
17
+ expect(subject[:k2]).to be_truthy
18
+ expect(subject[:k]).to be_nil
19
19
 
20
20
  subject.clear
21
21
 
@@ -23,23 +23,23 @@ describe Arachni::Support::Cache::LeastRecentlyPushed do
23
23
  subject[:k] = '1'
24
24
  subject[:k2] = '3'
25
25
  subject[:k3] = '4'
26
- subject.size.should == 1
26
+ expect(subject.size).to eq(1)
27
27
 
28
- subject[:k3].should be_true
29
- subject[:k2].should be_nil
30
- subject[:k].should be_nil
28
+ expect(subject[:k3]).to be_truthy
29
+ expect(subject[:k2]).to be_nil
30
+ expect(subject[:k]).to be_nil
31
31
  end
32
32
 
33
33
  describe '#[]=' do
34
34
  it 'stores an object' do
35
35
  v = 'val'
36
- (subject[:key] = v).should == v
37
- subject[:key].should == v
36
+ expect(subject[:key] = v).to eq(v)
37
+ expect(subject[:key]).to eq(v)
38
38
  end
39
39
  it 'alias of #store' do
40
40
  v = 'val2'
41
- subject.store( :key2, v ).should == v
42
- subject[:key2].should == v
41
+ expect(subject.store( :key2, v )).to eq(v)
42
+ expect(subject[:key2]).to eq(v)
43
43
  end
44
44
  end
45
45
 
@@ -47,13 +47,13 @@ describe Arachni::Support::Cache::LeastRecentlyPushed do
47
47
  it 'retrieves an object by key' do
48
48
  v = 'val2'
49
49
  subject[:key] = v
50
- subject[:key].should == v
51
- subject.empty?.should be_false
50
+ expect(subject[:key]).to eq(v)
51
+ expect(subject.empty?).to be_falsey
52
52
  end
53
53
 
54
54
  context 'when the key does not exist' do
55
55
  it 'returns nil' do
56
- subject[:some_key].should be_nil
56
+ expect(subject[:some_key]).to be_nil
57
57
  end
58
58
  end
59
59
  end
@@ -63,14 +63,14 @@ describe Arachni::Support::Cache::LeastRecentlyPushed do
63
63
  it 'deletes a key and return its value' do
64
64
  v = 'my_val'
65
65
  subject[:my_key] = v
66
- subject.delete( :my_key ).should == v
67
- subject[:my_key].should be_nil
68
- subject.include?( :my_key ).should be_false
66
+ expect(subject.delete( :my_key )).to eq(v)
67
+ expect(subject[:my_key]).to be_nil
68
+ expect(subject.include?( :my_key )).to be_falsey
69
69
  end
70
70
  end
71
71
  context 'when the key does not exist' do
72
72
  it 'returns nil' do
73
- subject.delete( :my_key2 ).should be_nil
73
+ expect(subject.delete( :my_key2 )).to be_nil
74
74
  end
75
75
  end
76
76
  end
@@ -78,12 +78,12 @@ describe Arachni::Support::Cache::LeastRecentlyPushed do
78
78
  describe '#clear' do
79
79
  it 'empties the cache' do
80
80
  subject[:my_key2] = 'v'
81
- subject.size.should > 0
82
- subject.empty?.should be_false
81
+ expect(subject.size).to be > 0
82
+ expect(subject.empty?).to be_falsey
83
83
  subject.clear
84
84
 
85
- subject.size.should == 0
86
- subject.empty?.should be_true
85
+ expect(subject.size).to eq(0)
86
+ expect(subject.empty?).to be_truthy
87
87
  end
88
88
  end
89
89
 
@@ -12,26 +12,26 @@ describe Arachni::Support::Cache::LeastRecentlyUsed do
12
12
  subject[:k3] = '3'
13
13
  subject[:k4] = '4'
14
14
 
15
- subject.size.should == 3
15
+ expect(subject.size).to eq(3)
16
16
 
17
17
  ap subject
18
18
 
19
- subject[:k].should be_true
20
- subject[:k4].should be_true
21
- subject[:k3].should be_true
22
- subject[:k2].should be_nil
19
+ expect(subject[:k]).to be_truthy
20
+ expect(subject[:k4]).to be_truthy
21
+ expect(subject[:k3]).to be_truthy
22
+ expect(subject[:k2]).to be_nil
23
23
  end
24
24
 
25
25
  describe '#[]=' do
26
26
  it 'stores an object' do
27
27
  v = 'val'
28
- (subject[:key] = v).should == v
29
- subject[:key].should == v
28
+ expect(subject[:key] = v).to eq(v)
29
+ expect(subject[:key]).to eq(v)
30
30
  end
31
31
  it 'alias of #store' do
32
32
  v = 'val2'
33
- subject.store( :key2, v ).should == v
34
- subject[:key2].should == v
33
+ expect(subject.store( :key2, v )).to eq(v)
34
+ expect(subject[:key2]).to eq(v)
35
35
  end
36
36
  end
37
37
 
@@ -39,13 +39,13 @@ describe Arachni::Support::Cache::LeastRecentlyUsed do
39
39
  it 'retrieves an object by key' do
40
40
  v = 'val2'
41
41
  subject[:key] = v
42
- subject[:key].should == v
43
- subject.empty?.should be_false
42
+ expect(subject[:key]).to eq(v)
43
+ expect(subject.empty?).to be_falsey
44
44
  end
45
45
 
46
46
  context 'when the key does not exist' do
47
47
  it 'returns nil' do
48
- subject[:some_key].should be_nil
48
+ expect(subject[:some_key]).to be_nil
49
49
  end
50
50
  end
51
51
  end
@@ -55,14 +55,14 @@ describe Arachni::Support::Cache::LeastRecentlyUsed do
55
55
  it 'deletes a key and return its value' do
56
56
  v = 'my_val'
57
57
  subject[:my_key] = v
58
- subject.delete( :my_key ).should == v
59
- subject[:my_key].should be_nil
60
- subject.include?( :my_key ).should be_false
58
+ expect(subject.delete( :my_key )).to eq(v)
59
+ expect(subject[:my_key]).to be_nil
60
+ expect(subject.include?( :my_key )).to be_falsey
61
61
  end
62
62
  end
63
63
  context 'when the key does not exist' do
64
64
  it 'returns nil' do
65
- subject.delete( :my_key2 ).should be_nil
65
+ expect(subject.delete( :my_key2 )).to be_nil
66
66
  end
67
67
  end
68
68
  end
@@ -70,12 +70,12 @@ describe Arachni::Support::Cache::LeastRecentlyUsed do
70
70
  describe '#clear' do
71
71
  it 'empties the cache' do
72
72
  subject[:my_key2] = 'v'
73
- subject.size.should > 0
74
- subject.empty?.should be_false
73
+ expect(subject.size).to be > 0
74
+ expect(subject.empty?).to be_falsey
75
75
  subject.clear
76
76
 
77
- subject.size.should == 0
78
- subject.empty?.should be_true
77
+ expect(subject.size).to eq(0)
78
+ expect(subject.empty?).to be_truthy
79
79
  end
80
80
  end
81
81
 
@@ -13,9 +13,9 @@ describe Arachni::Support::Cache::Preference do
13
13
  subject[k[1]] = '2'
14
14
  subject[k[2]] = '3'
15
15
  subject[k[3]] = '4'
16
- subject.size.should == 3
16
+ expect(subject.size).to eq(3)
17
17
 
18
- k.map { |key| subject[key] }.count( nil ).should == 1
18
+ expect(k.map { |key| subject[key] }.count( nil )).to eq(1)
19
19
 
20
20
  subject.clear
21
21
  end
@@ -29,9 +29,9 @@ describe Arachni::Support::Cache::Preference do
29
29
  subject[k[0]] = '1'
30
30
  subject[k[1]] = '3'
31
31
  subject[k[2]] = '4'
32
- subject.size.should == 2
32
+ expect(subject.size).to eq(2)
33
33
 
34
- k[0...3].map { |key| subject[key] }.count( nil ).should == 1
34
+ expect(k[0...3].map { |key| subject[key] }.count( nil )).to eq(1)
35
35
  end
36
36
 
37
37
  end
@@ -11,9 +11,9 @@ describe Arachni::Support::Cache::RandomReplacement do
11
11
  subject[k[1]] = '2'
12
12
  subject[k[2]] = '3'
13
13
  subject[k[3]] = '4'
14
- subject.size.should == 3
14
+ expect(subject.size).to eq(3)
15
15
 
16
- k.map { |key| subject[key] }.count( nil ).should == 1
16
+ expect(k.map { |key| subject[key] }.count( nil )).to eq(1)
17
17
 
18
18
  subject.clear
19
19
 
@@ -21,21 +21,21 @@ describe Arachni::Support::Cache::RandomReplacement do
21
21
  subject[k[0]] = '1'
22
22
  subject[k[1]] = '3'
23
23
  subject[k[2]] = '4'
24
- subject.size.should == 1
24
+ expect(subject.size).to eq(1)
25
25
 
26
- k[0...3].map { |key| subject[key] }.count( nil ).should == 2
26
+ expect(k[0...3].map { |key| subject[key] }.count( nil )).to eq(2)
27
27
  end
28
28
 
29
29
  describe '#[]=' do
30
30
  it 'stores an object' do
31
31
  v = 'val'
32
- (subject[:key] = v).should == v
33
- subject[:key].should == v
32
+ expect(subject[:key] = v).to eq(v)
33
+ expect(subject[:key]).to eq(v)
34
34
  end
35
35
  it 'alias of #store' do
36
36
  v = 'val2'
37
- subject.store( :key2, v ).should == v
38
- subject[:key2].should == v
37
+ expect(subject.store( :key2, v )).to eq(v)
38
+ expect(subject[:key2]).to eq(v)
39
39
  end
40
40
  end
41
41
 
@@ -23,7 +23,7 @@ describe Arachni::Support::Crypto::RSA_AES_CBC do
23
23
  end
24
24
 
25
25
  it 'generates matching encrypted and decrypted data' do
26
- @crypto.decrypt( @crypto.encrypt( SEED ) ).should == SEED
26
+ expect(@crypto.decrypt( @crypto.encrypt( SEED ) )).to eq(SEED)
27
27
  end
28
28
 
29
29
  end
@@ -17,134 +17,135 @@ describe Arachni::Support::Database::Hash do
17
17
  it 'implements #empty?' do
18
18
  h = described_class.new
19
19
 
20
- h.empty?.should == {}.empty?
20
+ expect(h.empty?).to eq({}.empty?)
21
21
 
22
22
  nh = { :k => 'v' }
23
23
  h[:k] = 'v'
24
24
 
25
- h.empty?.should == nh.empty?
25
+ expect(h.empty?).to eq(nh.empty?)
26
26
  h.clear
27
27
  end
28
28
 
29
29
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-5B-5D-3D
30
30
  it 'implements #[]=( k, v ) (and store( k, v ))' do
31
31
  @seeds.each do |k, v|
32
- (@hash[k] = v).should == v
32
+ expect(@hash[k] = v).to eq(v)
33
33
  end
34
34
  end
35
35
 
36
36
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-5B-5D
37
37
  it 'implements #[]' do
38
38
  @seeds.each do |k, v|
39
- @hash[k].should == v
39
+ expect(@hash[k]).to eq(v)
40
40
  end
41
41
 
42
- @hash[@non_existent].should == @seeds[@non_existent]
42
+ expect(@hash[@non_existent]).to eq(@seeds[@non_existent])
43
43
  end
44
44
 
45
45
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-assoc
46
46
  it 'implements #assoc( k )' do
47
47
  @seeds.each do |k, v|
48
- @hash.assoc( k ).should == @seeds.assoc( k )
48
+ expect(@hash.assoc( k )).to eq(@seeds.assoc( k ))
49
49
  end
50
50
 
51
- @hash.assoc( @non_existent ).should == @seeds.assoc( @non_existent )
51
+ expect(@hash.assoc( @non_existent )).to eq(@seeds.assoc( @non_existent ))
52
52
  end
53
53
 
54
54
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-rassoc
55
55
  it 'implements #rassoc( k )' do
56
56
  @seeds.each do |k, v|
57
- @hash.rassoc( v ).should == @seeds.rassoc( v )
57
+ expect(@hash.rassoc( v )).to eq(@seeds.rassoc( v ))
58
58
  end
59
59
 
60
- @hash.rassoc( @non_existent ).should == @seeds.rassoc( @non_existent )
60
+ expect(@hash.rassoc( @non_existent )).to eq(@seeds.rassoc( @non_existent ))
61
61
  end
62
62
 
63
63
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-delete
64
64
  it 'implements #delete( k, &block )' do
65
- @hash.delete( @non_existent ).should == @seeds.delete( @non_existent )
65
+ expect(@hash.delete( @non_existent )).to eq(@seeds.delete( @non_existent ))
66
66
  @seeds[@non_existent] = @hash[@non_existent] = 'foo'
67
- @hash.delete( @non_existent ).should == @seeds.delete( @non_existent )
67
+ expect(@hash.delete( @non_existent )).to eq(@seeds.delete( @non_existent ))
68
68
 
69
- @hash.delete( @non_existent ) { |k| k }.should ==
69
+ expect(@hash.delete( @non_existent ) { |k| k }).to eq(
70
70
  @seeds.delete( @non_existent ) { |k| k }
71
+ )
71
72
  end
72
73
 
73
74
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-shift
74
75
  it 'implements #shift' do
75
- @hash.shift.should == @seeds.shift
76
+ expect(@hash.shift).to eq(@seeds.shift)
76
77
  end
77
78
 
78
79
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-each
79
80
  it 'implements #each() (and #each_pair())' do
80
81
  @hash.each do |k, v|
81
- @seeds[k].should == v
82
+ expect(@seeds[k]).to eq(v)
82
83
  end
83
84
 
84
85
  # they must both return enumerators
85
- @hash.each.class.should == @seeds.each.class
86
+ expect(@hash.each.class).to eq(@seeds.each.class)
86
87
 
87
88
  @hash.each_pair do |k, v|
88
- @seeds[k].should == v
89
+ expect(@seeds[k]).to eq(v)
89
90
  end
90
91
 
91
92
  # they must both return enumerators
92
- @hash.each_pair.class.should == @seeds.each_pair.class
93
+ expect(@hash.each_pair.class).to eq(@seeds.each_pair.class)
93
94
  end
94
95
 
95
96
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-each_key
96
97
  it 'implements #each_key' do
97
98
  @hash.each_key do |k|
98
- @seeds[k].should == @hash[k]
99
+ expect(@seeds[k]).to eq(@hash[k])
99
100
  end
100
101
 
101
102
  # they must both return enumerators
102
- @hash.each_key.class.should == @seeds.each_key.class
103
+ expect(@hash.each_key.class).to eq(@seeds.each_key.class)
103
104
  end
104
105
 
105
106
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-each_value
106
107
  it 'implements #each_value' do
107
108
  @hash.each_value do |v|
108
- @seeds[ @seeds.key( v )].should == v
109
+ expect(@seeds[ @seeds.key( v )]).to eq(v)
109
110
  end
110
111
 
111
112
  # they must both return enumerators
112
- @hash.each_value.class.should == @seeds.each_value.class
113
+ expect(@hash.each_value.class).to eq(@seeds.each_value.class)
113
114
  end
114
115
 
115
116
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-keys
116
117
  it 'implements #keys' do
117
- @hash.keys.should == @seeds.keys
118
+ expect(@hash.keys).to eq(@seeds.keys)
118
119
  end
119
120
 
120
121
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key
121
122
  it 'implement #key' do
122
123
  @hash.each_key do |k|
123
- @seeds.key( k ).should == @hash.key( k )
124
+ expect(@seeds.key( k )).to eq(@hash.key( k ))
124
125
  end
125
126
 
126
- @hash.key( @non_existent ).should == @seeds.key( @non_existent )
127
+ expect(@hash.key( @non_existent )).to eq(@seeds.key( @non_existent ))
127
128
  end
128
129
 
129
130
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-values
130
131
  it 'implements #values' do
131
- @hash.values.should == @seeds.values
132
+ expect(@hash.values).to eq(@seeds.values)
132
133
  end
133
134
 
134
135
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-include?
135
136
  it 'implements #include? (and #member?, #key?, #has_key?)' do
136
137
  @hash.each_key {
137
138
  |k|
138
- @seeds.include?( k ).should == @hash.include?( k )
139
- @seeds.member?( k ).should == @hash.member?( k )
140
- @seeds.key?( k ).should == @hash.key?( k )
141
- @seeds.has_key?( k ).should == @hash.has_key?( k )
139
+ expect(@seeds.include?( k )).to eq(@hash.include?( k ))
140
+ expect(@seeds.member?( k )).to eq(@hash.member?( k ))
141
+ expect(@seeds.key?( k )).to eq(@hash.key?( k ))
142
+ expect(@seeds.has_key?( k )).to eq(@hash.has_key?( k ))
142
143
  }
143
144
 
144
- @hash.include?( @non_existent ).should == @seeds.include?( @non_existent )
145
- @hash.member?( @non_existent ).should == @seeds.member?( @non_existent )
146
- @hash.key?( @non_existent ).should == @seeds.key?( @non_existent )
147
- @hash.has_key?( @non_existent ).should == @seeds.has_key?( @non_existent )
145
+ expect(@hash.include?( @non_existent )).to eq(@seeds.include?( @non_existent ))
146
+ expect(@hash.member?( @non_existent )).to eq(@seeds.member?( @non_existent ))
147
+ expect(@hash.key?( @non_existent )).to eq(@seeds.key?( @non_existent ))
148
+ expect(@hash.has_key?( @non_existent )).to eq(@seeds.has_key?( @non_existent ))
148
149
  end
149
150
 
150
151
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-merge
@@ -152,8 +153,8 @@ describe Arachni::Support::Database::Hash do
152
153
  mh = { :another_key => 'another value' }
153
154
 
154
155
  nh = @hash.merge( mh )
155
- nh.keys.should == @seeds.merge( mh ).keys
156
- nh.values.should == @seeds.merge( mh ).values
156
+ expect(nh.keys).to eq(@seeds.merge( mh ).keys)
157
+ expect(nh.values).to eq(@seeds.merge( mh ).values)
157
158
  end
158
159
 
159
160
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-merge!
@@ -167,36 +168,36 @@ describe Arachni::Support::Database::Hash do
167
168
  @hash.update( mh2 )
168
169
  @seeds.update( mh2 )
169
170
 
170
- @hash.keys.should == @seeds.keys
171
- @hash.values.should == @seeds.values
171
+ expect(@hash.keys).to eq(@seeds.keys)
172
+ expect(@hash.values).to eq(@seeds.values)
172
173
  end
173
174
 
174
175
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-to_hash
175
176
  it 'implements #to_hash' do
176
- @hash.to_hash.should == @seeds.to_hash
177
+ expect(@hash.to_hash).to eq(@seeds.to_hash)
177
178
  end
178
179
 
179
180
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-to_a
180
181
  it 'implements #to_a' do
181
- @hash.to_a.should == @seeds.to_a
182
+ expect(@hash.to_a).to eq(@seeds.to_a)
182
183
  end
183
184
 
184
185
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-size
185
186
  it 'implements #size' do
186
- @hash.size.should == @seeds.size
187
+ expect(@hash.size).to eq(@seeds.size)
187
188
  end
188
189
 
189
190
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-3D-3D
190
191
  it 'implements #== (and #eql?)' do
191
- (@hash == @hash.merge( {} )).should == true
192
- (@hash == @seeds).should == true
192
+ expect(@hash == @hash.merge( {} )).to eq(true)
193
+ expect(@hash == @seeds).to eq(true)
193
194
  end
194
195
 
195
196
  # http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-clear
196
197
  it 'implements #clear' do
197
198
  @hash.clear
198
199
  @seeds.clear
199
- @hash.size.should == @seeds.size
200
+ expect(@hash.size).to eq(@seeds.size)
200
201
  end
201
202
 
202
203
  after :all do