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
@@ -20,13 +20,13 @@ describe Arachni::Plugin::Base do
20
20
 
21
21
  describe '.distributable?' do
22
22
  it 'returns false' do
23
- described_class.should_not be_distributable
23
+ expect(described_class).not_to be_distributable
24
24
  end
25
25
 
26
26
  context 'when the distributable flag has been set' do
27
27
  it 'returns true' do
28
28
  described_class.distributable
29
- described_class.should be_distributable
29
+ expect(described_class).to be_distributable
30
30
  end
31
31
  end
32
32
  end
@@ -34,31 +34,31 @@ describe Arachni::Plugin::Base do
34
34
  describe '.is_distributable' do
35
35
  it 'sets the distributable? flag' do
36
36
  described_class.is_distributable
37
- described_class.should be_distributable
37
+ expect(described_class).to be_distributable
38
38
  end
39
39
  end
40
40
 
41
41
  describe '#info' do
42
42
  it 'returns .info' do
43
- subject.info.should == described_class.info
43
+ expect(subject.info).to eq(described_class.info)
44
44
  end
45
45
  end
46
46
 
47
47
  describe '#session' do
48
48
  it "returns #{Arachni::Framework}#session" do
49
- subject.session.should == framework.session
49
+ expect(subject.session).to eq(framework.session)
50
50
  end
51
51
  end
52
52
 
53
53
  describe '#http' do
54
54
  it "returns #{Arachni::Framework}#http" do
55
- subject.http.should == framework.http
55
+ expect(subject.http).to eq(framework.http)
56
56
  end
57
57
  end
58
58
 
59
59
  describe '#framework_pause' do
60
60
  it 'pauses the framework' do
61
- framework.should receive(:pause)
61
+ expect(framework).to receive(:pause)
62
62
  subject.framework_pause
63
63
  end
64
64
  end
@@ -69,14 +69,14 @@ describe Arachni::Plugin::Base do
69
69
 
70
70
  subject.framework_pause
71
71
 
72
- framework.should receive(:resume)
72
+ expect(framework).to receive(:resume)
73
73
  subject.framework_resume
74
74
  end
75
75
  end
76
76
 
77
77
  describe '#wait_while_framework_running' do
78
78
  it 'blocks while the framework runs' do
79
- framework.should be_running
79
+ expect(framework).to be_running
80
80
 
81
81
  q = Queue.new
82
82
  Thread.new do
@@ -90,7 +90,7 @@ describe Arachni::Plugin::Base do
90
90
  q.pop
91
91
  end
92
92
 
93
- framework.should_not be_running
93
+ expect(framework).not_to be_running
94
94
  end
95
95
  end
96
96
 
@@ -29,18 +29,18 @@ describe Arachni::Plugin::Manager do
29
29
  let(:state) { Arachni::State.plugins.runtime }
30
30
 
31
31
  it 'stores plugin options' do
32
- state[:suspendable][:options].should == {
32
+ expect(state[:suspendable][:options]).to eq({
33
33
  my_option: 'updated'
34
- }
34
+ })
35
35
  end
36
36
 
37
37
  it 'stores plugin state' do
38
- state.should include :suspendable
39
- state[:suspendable][:data].should == 1
38
+ expect(state).to include :suspendable
39
+ expect(state[:suspendable][:data]).to eq(1)
40
40
  end
41
41
 
42
42
  it 'kills the running plugins' do
43
- subject.jobs.should be_empty
43
+ expect(subject.jobs).to be_empty
44
44
  end
45
45
  end
46
46
 
@@ -63,45 +63,45 @@ describe Arachni::Plugin::Manager do
63
63
  it 'restores plugin options' do
64
64
  subject.restore
65
65
 
66
- subject.jobs[:suspendable][:instance].options.should == {
66
+ expect(subject.jobs[:suspendable][:instance].options).to eq({
67
67
  my_option: 'updated'
68
- }
68
+ })
69
69
  end
70
70
 
71
71
  it 'restores plugin state' do
72
72
  subject.restore
73
- subject.jobs[:suspendable][:instance].counter.should == 2
73
+ expect(subject.jobs[:suspendable][:instance].counter).to eq(2)
74
74
  end
75
75
 
76
76
  context 'when a loaded plugin has no associated state' do
77
77
  it "calls #{Arachni::Plugin::Base}#prepare instead of #{Arachni::Plugin::Base}#restore" do
78
78
  subject.state.delete :suspendable
79
79
  subject.restore
80
- subject.jobs[:suspendable][:instance].counter.should == 1
80
+ expect(subject.jobs[:suspendable][:instance].counter).to eq(1)
81
81
  end
82
82
  end
83
83
  end
84
84
 
85
85
  describe '#load_default' do
86
86
  it 'loads default plugins' do
87
- subject.should be_empty
87
+ expect(subject).to be_empty
88
88
  subject.load_default
89
- subject.include?( 'default' ).should be_true
89
+ expect(subject.include?( 'default' )).to be_truthy
90
90
  subject.clear
91
91
  end
92
92
  it 'aliased to #load_defaults' do
93
- subject.should be_empty
93
+ expect(subject).to be_empty
94
94
  subject.load_defaults
95
- subject.include?( 'default' ).should be_true
95
+ expect(subject.include?( 'default' )).to be_truthy
96
96
  end
97
97
  end
98
98
 
99
99
  describe '#default' do
100
100
  it 'returns the default plugins' do
101
- subject.default.include?( 'default' ).should be_true
101
+ expect(subject.default.include?( 'default' )).to be_truthy
102
102
  end
103
103
  it 'aliased to #defaults' do
104
- subject.defaults.include?( 'default' ).should be_true
104
+ expect(subject.defaults.include?( 'default' )).to be_truthy
105
105
  end
106
106
  end
107
107
 
@@ -110,18 +110,18 @@ describe Arachni::Plugin::Manager do
110
110
  subject.load_default
111
111
  subject.run
112
112
  subject.block
113
- subject.results[:default][:results].should be_true
113
+ expect(subject.results[:default][:results]).to be_truthy
114
114
  end
115
115
  end
116
116
 
117
117
  describe '#schedule' do
118
118
  it 'returns scheduled plugins' do
119
119
  subject.load_default
120
- subject.schedule.should == {
120
+ expect(subject.schedule).to eq({
121
121
  default: {
122
122
  int_opt: 4
123
123
  }
124
- }
124
+ })
125
125
  end
126
126
 
127
127
  context 'when plugins have :priority' do
@@ -137,10 +137,10 @@ describe Arachni::Plugin::Manager do
137
137
  it 'orders them based on priority' do
138
138
  subject.load '*'
139
139
  scheduled = subject.schedule.keys
140
- scheduled[0..1].sort.should == [:p0, :p00].sort
141
- scheduled[2].should == :p1
142
- scheduled[3..5].sort.should == [:p22, :p222, :p2].sort
143
- scheduled[6..7].sort.should == [:p_nil, :p_nil2].sort
140
+ expect(scheduled[0..1].sort).to eq([:p0, :p00].sort)
141
+ expect(scheduled[2]).to eq(:p1)
142
+ expect(scheduled[3..5].sort).to eq([:p22, :p222, :p2].sort)
143
+ expect(scheduled[6..7].sort).to eq([:p_nil, :p_nil2].sort)
144
144
  end
145
145
  end
146
146
 
@@ -155,12 +155,12 @@ describe Arachni::Plugin::Manager do
155
155
  describe '#sane_env?' do
156
156
  context 'when gem dependencies are met' do
157
157
  it 'returns true' do
158
- subject.sane_env?( subject['default'] ).should == true
158
+ expect(subject.sane_env?( subject['default'] )).to eq(true)
159
159
  end
160
160
  end
161
161
  context 'when gem dependencies are not met' do
162
162
  it 'returns a hash with errors' do
163
- subject.sane_env?( subject['bad'] ).include?( :gem_errors ).should be_true
163
+ expect(subject.sane_env?( subject['bad'] ).include?( :gem_errors )).to be_truthy
164
164
  subject.delete( 'bad' )
165
165
  end
166
166
  end
@@ -168,7 +168,7 @@ describe Arachni::Plugin::Manager do
168
168
 
169
169
  describe '#create' do
170
170
  it 'returns a plugin instance' do
171
- subject.create( 'default' ).instance_of?( subject['default'] ).should be_true
171
+ expect(subject.create( 'default' ).instance_of?( subject['default'] )).to be_truthy
172
172
  end
173
173
  end
174
174
 
@@ -177,7 +177,7 @@ describe Arachni::Plugin::Manager do
177
177
  it 'returns true' do
178
178
  subject.load :wait
179
179
  subject.run
180
- subject.busy?.should be_true
180
+ expect(subject.busy?).to be_truthy
181
181
  framework.state.running = false
182
182
  subject.block
183
183
  end
@@ -186,7 +186,7 @@ describe Arachni::Plugin::Manager do
186
186
  it 'returns false' do
187
187
  subject.run
188
188
  subject.block
189
- subject.busy?.should be_false
189
+ expect(subject.busy?).to be_falsey
190
190
  end
191
191
  end
192
192
  end
@@ -195,7 +195,7 @@ describe Arachni::Plugin::Manager do
195
195
  context 'when plugins are running' do
196
196
  it 'returns the names of the running plugins' do
197
197
  subject.run
198
- subject.job_names.should == subject.keys
198
+ expect(subject.job_names).to eq(subject.keys)
199
199
  subject.block
200
200
  end
201
201
  end
@@ -203,7 +203,7 @@ describe Arachni::Plugin::Manager do
203
203
  it 'returns an empty array' do
204
204
  subject.run
205
205
  subject.block
206
- subject.job_names.should be_empty
206
+ expect(subject.job_names).to be_empty
207
207
  end
208
208
  end
209
209
  end
@@ -213,7 +213,7 @@ describe Arachni::Plugin::Manager do
213
213
  it 'returns the plugins threads' do
214
214
  subject.load :wait
215
215
  subject.run
216
- subject.jobs[:wait].should be_instance_of Thread
216
+ expect(subject.jobs[:wait]).to be_instance_of Thread
217
217
 
218
218
  framework.state.running = false
219
219
 
@@ -227,7 +227,7 @@ describe Arachni::Plugin::Manager do
227
227
  framework.state.running = false
228
228
 
229
229
  subject.block
230
- subject.jobs.should be_empty
230
+ expect(subject.jobs).to be_empty
231
231
  end
232
232
  end
233
233
  end
@@ -240,7 +240,7 @@ describe Arachni::Plugin::Manager do
240
240
  ret = subject.kill( 'loop' )
241
241
  subject.block
242
242
 
243
- ret.should be_true
243
+ expect(ret).to be_truthy
244
244
  subject.delete( 'loop' )
245
245
  end
246
246
  end
@@ -249,31 +249,32 @@ describe Arachni::Plugin::Manager do
249
249
  it 'returns false' do
250
250
  subject.run
251
251
  subject.block
252
- subject.kill( 'default' ).should be_false
252
+ expect(subject.kill( 'default' )).to be_falsey
253
253
  end
254
254
  end
255
255
  end
256
256
 
257
257
  describe '#results' do
258
258
  it "delegates to ##{Arachni::Data::Plugins}#results" do
259
- Arachni::Data.plugins.results.object_id.should ==
259
+ expect(Arachni::Data.plugins.results.object_id).to eq(
260
260
  subject.results.object_id
261
+ )
261
262
  end
262
263
  end
263
264
 
264
265
  describe '#reset' do
265
266
  it 'calls #kill' do
266
- subject.should receive(:killall).at_least(1).times
267
+ expect(subject).to receive(:killall).at_least(1).times
267
268
  subject.reset
268
269
  end
269
270
 
270
271
  it 'calls #clear' do
271
- subject.should receive(:clear).at_least(1).times
272
+ expect(subject).to receive(:clear).at_least(1).times
272
273
  subject.reset
273
274
  end
274
275
 
275
276
  it 'calls .reset' do
276
- described_class.should receive(:reset).at_least(1).times
277
+ expect(described_class).to receive(:reset).at_least(1).times
277
278
  subject.reset
278
279
  end
279
280
  end
@@ -23,7 +23,7 @@ describe Arachni::Report do
23
23
  cloned = Arachni::RPC::Serializer.deep_clone( report )
24
24
  cloned.options.delete :input
25
25
 
26
- report.should == cloned
26
+ expect(report).to eq(cloned)
27
27
  end
28
28
 
29
29
  describe '#to_rpc_data' do
@@ -32,13 +32,14 @@ describe Arachni::Report do
32
32
 
33
33
  %w(sitemap version).each do |attribute|
34
34
  it "includes '#{attribute}'" do
35
- data[attribute].should == subject.send( attribute )
35
+ expect(data[attribute]).to eq(subject.send( attribute ))
36
36
  end
37
37
  end
38
38
 
39
39
  it "includes 'options'" do
40
- data['options'].should ==
40
+ expect(data['options']).to eq(
41
41
  Arachni::Options.update( subject.options ).to_rpc_data
42
+ )
42
43
  end
43
44
 
44
45
  it "includes 'plugins'" do
@@ -48,17 +49,17 @@ describe Arachni::Report do
48
49
  info_1 = data['plugins'].each { |name, d| d.delete :options }
49
50
  info_2 = subject.plugins.each { |name, d| d.delete :options }
50
51
 
51
- info_1.should == info_2
52
- options_1.should == options_2
52
+ expect(info_1).to eq(info_2)
53
+ expect(options_1).to eq(options_2)
53
54
  end
54
55
 
55
56
  it "includes 'issues'" do
56
- data['issues'].should == subject.issues.map(&:to_rpc_data)
57
+ expect(data['issues']).to eq(subject.issues.map(&:to_rpc_data))
57
58
  end
58
59
 
59
60
  %w(start_datetime finish_datetime).each do |attribute|
60
61
  it "includes '#{attribute}'" do
61
- data[attribute].should == subject.send( attribute ).to_s
62
+ expect(data[attribute]).to eq(subject.send( attribute ).to_s)
62
63
  end
63
64
  end
64
65
  end
@@ -71,7 +72,7 @@ describe Arachni::Report do
71
72
 
72
73
  %w(sitemap issues plugins version).each do |attribute|
73
74
  it "restores '#{attribute}'" do
74
- restored.send( attribute ).should == subject.send( attribute )
75
+ expect(restored.send( attribute )).to eq(subject.send( attribute ))
75
76
  end
76
77
  end
77
78
 
@@ -79,32 +80,32 @@ describe Arachni::Report do
79
80
  restored.options.delete :input
80
81
  subject.options.delete :input
81
82
 
82
- restored.options.should == subject.options
83
+ expect(restored.options).to eq(subject.options)
83
84
  end
84
85
 
85
86
  %w(start_datetime finish_datetime).each do |attribute|
86
87
  it "restores '#{attribute}'" do
87
- restored.send( attribute ).should be_kind_of Time
88
- restored.send( attribute ).to_s.should == subject.send( attribute ).to_s
88
+ expect(restored.send( attribute )).to be_kind_of Time
89
+ expect(restored.send( attribute ).to_s).to eq(subject.send( attribute ).to_s)
89
90
  end
90
91
  end
91
92
  end
92
93
 
93
94
  describe '#version' do
94
95
  it 'returns the version number' do
95
- report.version.should == Arachni::VERSION
96
+ expect(report.version).to eq(Arachni::VERSION)
96
97
  end
97
98
  end
98
99
 
99
100
  describe '#url' do
100
101
  it 'returns the targeted URL' do
101
- report.url.should == report.options[:url]
102
+ expect(report.url).to eq(report.options[:url])
102
103
  end
103
104
  end
104
105
 
105
106
  describe '#options' do
106
107
  it 'returns Arachni::Options as a hash' do
107
- report.options.should == Arachni::Options.to_hash
108
+ expect(report.options).to eq(Arachni::Options.to_hash)
108
109
  end
109
110
 
110
111
  it 'defaults to Arachni::Options#to_hash' do
@@ -114,26 +115,26 @@ describe Arachni::Report do
114
115
  new.delete :input
115
116
  hash.delete :input
116
117
 
117
- new.should == hash
118
+ expect(new).to eq(hash)
118
119
  end
119
120
  end
120
121
 
121
122
  describe '#sitemap' do
122
123
  it 'returns the sitemap' do
123
- report.sitemap.should == {@opts.url.to_s => 200}
124
+ expect(report.sitemap).to eq({@opts.url.to_s => 200})
124
125
  end
125
126
  end
126
127
 
127
128
  describe '#issues' do
128
129
  it 'returns the issues' do
129
130
  issues = [Factory[:issue]]
130
- described_class.new( issues: issues ).issues.should == issues
131
+ expect(described_class.new( issues: issues ).issues).to eq(issues)
131
132
  end
132
133
  end
133
134
 
134
135
  describe '#issue_by_check' do
135
136
  it 'returns issue logged by the given check' do
136
- report.issues.should be_any
137
+ expect(report.issues).to be_any
137
138
 
138
139
  report.issues.first.check[:shortname] << 'stuff'
139
140
 
@@ -141,63 +142,64 @@ describe Arachni::Report do
141
142
 
142
143
  filtered_issues = report.issues_by_check( check )
143
144
  filtered_issues.each do |issue|
144
- issue.check[:shortname].should == check
145
+ expect(issue.check[:shortname]).to eq(check)
145
146
  end
146
147
 
147
- report.issues.size.should > filtered_issues.size
148
+ expect(report.issues.size).to be > filtered_issues.size
148
149
  end
149
150
  end
150
151
 
151
152
  describe '#issue_by_digest' do
152
153
  it 'returns an issue based on its digest' do
153
- report.issues.should be_any
154
+ expect(report.issues).to be_any
154
155
 
155
156
  report.issues.each do |issue|
156
- report.issue_by_digest( issue.digest ).should == issue
157
+ expect(report.issue_by_digest( issue.digest )).to eq(issue)
157
158
  end
158
159
  end
159
160
  end
160
161
 
161
162
  describe '#plugins' do
162
163
  it 'returns the plugin results' do
163
- report.plugins.should == Factory[:report_data][:plugins]
164
+ expect(report.plugins).to eq(Factory[:report_data][:plugins])
164
165
  end
165
166
  end
166
167
 
167
168
  describe '#start_datetime' do
168
169
  it 'returns a Time object' do
169
- report.start_datetime.should be_kind_of Time
170
+ expect(report.start_datetime).to be_kind_of Time
170
171
  end
171
172
  context 'when no start datetime info has been provided' do
172
173
  it 'falls-back to Time.now' do
173
- report_empty.start_datetime.should be_kind_of Time
174
+ expect(report_empty.start_datetime).to be_kind_of Time
174
175
  end
175
176
  end
176
177
  end
177
178
 
178
179
  describe '#finish_datetime' do
179
180
  it 'returns a Time object' do
180
- report.finish_datetime.should be_kind_of Time
181
+ expect(report.finish_datetime).to be_kind_of Time
181
182
  end
182
183
  it 'returns the start finish of the scan' do
183
- report.finish_datetime.to_s.should ==
184
+ expect(report.finish_datetime.to_s).to eq(
184
185
  Factory[:report_data][:finish_datetime].to_s
186
+ )
185
187
  end
186
188
  context 'when no start datetime info has been provided' do
187
189
  it 'falls-back to Time.now' do
188
- report_empty.finish_datetime.should be_kind_of Time
190
+ expect(report_empty.finish_datetime).to be_kind_of Time
189
191
  end
190
192
  end
191
193
  end
192
194
 
193
195
  describe '#delta_time' do
194
196
  it 'returns the time difference between start and finish time' do
195
- report.delta_time.should == '02:46:40'
197
+ expect(report.delta_time).to eq('02:46:40')
196
198
  end
197
199
  context 'when no #finish_datetime has been provided' do
198
200
  it 'uses Time.now for the calculation' do
199
201
  report_empty.start_datetime = Time.now - 2000
200
- report_empty.delta_time.to_s.should == '00:33:19'
202
+ expect(report_empty.delta_time.to_s).to eq('00:33:19')
201
203
  end
202
204
  end
203
205
  end
@@ -205,8 +207,9 @@ describe Arachni::Report do
205
207
  describe '.read_summary' do
206
208
  it 'returns summary' do
207
209
  @report_file = report.save
208
- described_class.read_summary( @report_file ).should ==
210
+ expect(described_class.read_summary( @report_file )).to eq(
209
211
  Arachni::RPC::Serializer.load( Arachni::RPC::Serializer.dump( report.summary ) )
212
+ )
210
213
  end
211
214
  end
212
215
 
@@ -214,7 +217,7 @@ describe Arachni::Report do
214
217
  it 'dumps the object to a file' do
215
218
  @report_file = report.save
216
219
 
217
- described_class.load( @report_file ).should == report
220
+ expect(described_class.load( @report_file )).to eq(report)
218
221
  end
219
222
 
220
223
  context 'when given a location' do
@@ -223,7 +226,7 @@ describe Arachni::Report do
223
226
  @report_file = 'report'
224
227
  report.save( @report_file )
225
228
 
226
- described_class.load( @report_file ).should == report
229
+ expect(described_class.load( @report_file )).to eq(report)
227
230
  end
228
231
  end
229
232
 
@@ -232,7 +235,7 @@ describe Arachni::Report do
232
235
  directory = Dir.tmpdir
233
236
  @report_file = report.save( directory )
234
237
 
235
- described_class.load( @report_file ).should == report
238
+ expect(described_class.load( @report_file )).to eq(report)
236
239
  end
237
240
  end
238
241
  end
@@ -242,13 +245,13 @@ describe Arachni::Report do
242
245
  it 'returns the object in AFR format' do
243
246
  @report_file = report.save
244
247
 
245
- IO.binread( @report_file ).should == report.to_afr
248
+ expect(IO.binread( @report_file )).to eq(report.to_afr)
246
249
  end
247
250
  end
248
251
 
249
252
  describe '#to_h' do
250
253
  it 'returns the object as a hash' do
251
- report.to_h.should == {
254
+ expect(report.to_h).to eq({
252
255
  version: report.version,
253
256
  options: Arachni::Options.hash_to_rpc_data( report.options ),
254
257
  sitemap: report.sitemap,
@@ -272,27 +275,27 @@ describe Arachni::Report do
272
275
  ]
273
276
  }
274
277
  }
275
- }
278
+ })
276
279
  end
277
280
  end
278
281
 
279
282
  describe '#to_hash' do
280
283
  it 'alias of #to_h' do
281
- report.to_h.should == report.to_hash
284
+ expect(report.to_h).to eq(report.to_hash)
282
285
  end
283
286
  end
284
287
 
285
288
  describe '#==' do
286
289
  context 'when the reports are equal' do
287
290
  it 'returns true' do
288
- report.deep_clone.should == report
291
+ expect(report.deep_clone).to eq(report)
289
292
  end
290
293
  end
291
294
  context 'when the reports are not equal' do
292
295
  it 'returns false' do
293
296
  a = report.deep_clone
294
297
  a.options[:url] = 'http://stuff/'
295
- a.should_not == report
298
+ expect(a).not_to eq(report)
296
299
  end
297
300
  end
298
301
  end