arachni 1.2.1 → 1.3

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -16,14 +16,14 @@ describe Arachni::State::Audit do
16
16
 
17
17
  it 'includes the total audit operations' do
18
18
  subject << audit_id
19
- statistics[:total].should == subject.size
19
+ expect(statistics[:total]).to eq(subject.size)
20
20
  end
21
21
  end
22
22
 
23
23
  describe '#<<' do
24
24
  it 'pushes a state' do
25
25
  subject << audit_id
26
- subject.should include audit_id
26
+ expect(subject).to include audit_id
27
27
  end
28
28
  end
29
29
 
@@ -31,13 +31,13 @@ describe Arachni::State::Audit do
31
31
  context 'when an operation is included' do
32
32
  it 'returns true' do
33
33
  subject << audit_id
34
- subject.should include audit_id
34
+ expect(subject).to include audit_id
35
35
  end
36
36
  end
37
37
  context 'when an operation is not included' do
38
38
  it 'returns false' do
39
39
  subject << audit_id
40
- subject.should_not include "#{audit_id}2"
40
+ expect(subject).not_to include "#{audit_id}2"
41
41
  end
42
42
  end
43
43
  end
@@ -45,13 +45,13 @@ describe Arachni::State::Audit do
45
45
  describe '#empty?' do
46
46
  context 'when the list is empty' do
47
47
  it 'returns true' do
48
- subject.should be_empty
48
+ expect(subject).to be_empty
49
49
  end
50
50
  end
51
51
  context 'when the list is not empty' do
52
52
  it 'returns false' do
53
53
  subject << audit_id
54
- subject.should_not be_empty
54
+ expect(subject).not_to be_empty
55
55
  end
56
56
  end
57
57
  end
@@ -59,13 +59,13 @@ describe Arachni::State::Audit do
59
59
  describe '#any?' do
60
60
  context 'when the list is empty' do
61
61
  it 'returns false' do
62
- subject.should_not be_any
62
+ expect(subject).not_to be_any
63
63
  end
64
64
  end
65
65
  context 'when the list is not empty' do
66
66
  it 'returns true' do
67
67
  subject << audit_id
68
- subject.should be_any
68
+ expect(subject).to be_any
69
69
  end
70
70
  end
71
71
  end
@@ -74,7 +74,7 @@ describe Arachni::State::Audit do
74
74
  it 'returns the size of the list' do
75
75
  subject << audit_id
76
76
  subject << "#{audit_id}2"
77
- subject.size.should == 2
77
+ expect(subject.size).to eq(2)
78
78
  end
79
79
  end
80
80
 
@@ -92,7 +92,7 @@ describe Arachni::State::Audit do
92
92
  subject << "#{audit_id}2"
93
93
  subject.dump( dump_directory )
94
94
 
95
- subject.should == described_class.load( dump_directory )
95
+ expect(subject).to eq(described_class.load( dump_directory ))
96
96
  end
97
97
  end
98
98
 
@@ -100,7 +100,7 @@ describe Arachni::State::Audit do
100
100
  it 'clears the list' do
101
101
  subject << audit_id
102
102
  subject.clear
103
- subject.should be_empty
103
+ expect(subject).to be_empty
104
104
  end
105
105
  end
106
106
 
@@ -13,7 +13,7 @@ describe Arachni::State::ElementFilter do
13
13
  %w(forms links cookies).each do |type|
14
14
  describe "##{type}" do
15
15
  it "returns a #{Arachni::Support::LookUp::HashSet}" do
16
- subject.send(type).should be_kind_of Arachni::Support::LookUp::HashSet
16
+ expect(subject.send(type)).to be_kind_of Arachni::Support::LookUp::HashSet
17
17
  end
18
18
  end
19
19
  end
@@ -24,7 +24,7 @@ describe Arachni::State::ElementFilter do
24
24
  %w(forms links cookies).each do |type|
25
25
  it "includes the amount of seen :#{type}" do
26
26
  subject.send(type) << type
27
- statistics[type.to_sym].should == subject.send(type).size
27
+ expect(statistics[type.to_sym]).to eq(subject.send(type).size)
28
28
  end
29
29
  end
30
30
  end
@@ -37,7 +37,7 @@ describe Arachni::State::ElementFilter do
37
37
 
38
38
  subject.dump( dump_directory )
39
39
 
40
- File.exist?( "#{dump_directory}/sets" ).should be_true
40
+ expect(File.exist?( "#{dump_directory}/sets" )).to be_truthy
41
41
  end
42
42
  end
43
43
 
@@ -49,7 +49,7 @@ describe Arachni::State::ElementFilter do
49
49
 
50
50
  subject.dump( dump_directory )
51
51
 
52
- subject.should == described_class.load( dump_directory )
52
+ expect(subject).to eq(described_class.load( dump_directory ))
53
53
  end
54
54
  end
55
55
 
@@ -57,9 +57,9 @@ describe Arachni::State::ElementFilter do
57
57
  %w(forms links cookies).each do |type|
58
58
  it "clears ##{type}" do
59
59
  subject.send(type) << 'stuff'
60
- subject.send(type).should_not be_empty
60
+ expect(subject.send(type)).not_to be_empty
61
61
  subject.clear
62
- subject.send(type).should be_empty
62
+ expect(subject.send(type)).to be_empty
63
63
  end
64
64
  end
65
65
  end
@@ -15,13 +15,13 @@ describe Arachni::State::Framework::RPC do
15
15
 
16
16
  describe '#distributed_pages' do
17
17
  it "returns an instance of #{Arachni::Support::LookUp::HashSet}" do
18
- subject.distributed_pages.should be_kind_of Arachni::Support::LookUp::HashSet
18
+ expect(subject.distributed_pages).to be_kind_of Arachni::Support::LookUp::HashSet
19
19
  end
20
20
  end
21
21
 
22
22
  describe '#distributed_elements' do
23
23
  it "returns an instance of #{Set}" do
24
- subject.distributed_elements.should be_kind_of Set
24
+ expect(subject.distributed_elements).to be_kind_of Set
25
25
  end
26
26
  end
27
27
 
@@ -30,12 +30,12 @@ describe Arachni::State::Framework::RPC do
30
30
 
31
31
  it 'includes the size of #distributed_pages' do
32
32
  subject.distributed_pages << url
33
- statistics[:distributed_pages].should == subject.distributed_pages.size
33
+ expect(statistics[:distributed_pages]).to eq(subject.distributed_pages.size)
34
34
  end
35
35
 
36
36
  it 'includes the size of #distributed_elements' do
37
37
  subject.distributed_elements << url.persistent_hash
38
- statistics[:distributed_elements].should == subject.distributed_elements.size
38
+ expect(statistics[:distributed_elements]).to eq(subject.distributed_elements.size)
39
39
  end
40
40
  end
41
41
 
@@ -44,15 +44,15 @@ describe Arachni::State::Framework::RPC do
44
44
  subject.distributed_pages << url
45
45
  subject.dump( dump_directory )
46
46
 
47
- Marshal.load( IO.read( "#{dump_directory}/distributed_pages" ) ).
48
- collection.should == Set.new([url.persistent_hash])
47
+ expect(Marshal.load( IO.read( "#{dump_directory}/distributed_pages" ) ).
48
+ collection).to eq(Set.new([url.persistent_hash]))
49
49
  end
50
50
 
51
51
  it 'stores #distributed_elements to disk' do
52
52
  subject.distributed_elements << url.persistent_hash
53
53
  subject.dump( dump_directory )
54
54
 
55
- Marshal.load( IO.read( "#{dump_directory}/distributed_elements" ) ).should == Set.new([url.persistent_hash])
55
+ expect(Marshal.load( IO.read( "#{dump_directory}/distributed_elements" ) )).to eq(Set.new([url.persistent_hash]))
56
56
  end
57
57
  end
58
58
 
@@ -61,23 +61,23 @@ describe Arachni::State::Framework::RPC do
61
61
  subject.distributed_pages << url
62
62
  subject.dump( dump_directory )
63
63
 
64
- described_class.load( dump_directory ).distributed_pages.
65
- collection.should == Set.new([url.persistent_hash])
64
+ expect(described_class.load( dump_directory ).distributed_pages.
65
+ collection).to eq(Set.new([url.persistent_hash]))
66
66
  end
67
67
 
68
68
  it 'loads #distributed_elements from disk' do
69
69
  subject.distributed_elements << url.persistent_hash
70
70
  subject.dump( dump_directory )
71
71
 
72
- described_class.load( dump_directory ).distributed_elements.
73
- should == Set.new([url.persistent_hash])
72
+ expect(described_class.load( dump_directory ).distributed_elements).
73
+ to eq(Set.new([url.persistent_hash]))
74
74
  end
75
75
  end
76
76
 
77
77
  describe '#clear' do
78
78
  %w(distributed_pages distributed_elements).each do |method|
79
79
  it "clears ##{method}" do
80
- subject.send(method).should receive(:clear)
80
+ expect(subject.send(method)).to receive(:clear)
81
81
  subject.clear
82
82
  end
83
83
  end
@@ -19,12 +19,12 @@ describe Arachni::State::Framework do
19
19
  it 'returns the assigned status messages' do
20
20
  message = 'Hey!'
21
21
  subject.set_status_message message
22
- subject.status_messages.should == [message]
22
+ expect(subject.status_messages).to eq([message])
23
23
  end
24
24
 
25
25
  context 'by defaults' do
26
26
  it 'returns an empty array' do
27
- subject.status_messages.should == []
27
+ expect(subject.status_messages).to eq([])
28
28
  end
29
29
  end
30
30
  end
@@ -34,7 +34,7 @@ describe Arachni::State::Framework do
34
34
  message = 'Hey!'
35
35
  subject.set_status_message message
36
36
  subject.set_status_message message
37
- subject.status_messages.should == [message]
37
+ expect(subject.status_messages).to eq([message])
38
38
  end
39
39
  end
40
40
 
@@ -45,7 +45,7 @@ describe Arachni::State::Framework do
45
45
  message = 'Hey!'
46
46
  subject.add_status_message message
47
47
  subject.add_status_message message
48
- subject.status_messages.should == [message, message]
48
+ expect(subject.status_messages).to eq([message, message])
49
49
  end
50
50
  end
51
51
 
@@ -53,7 +53,7 @@ describe Arachni::State::Framework do
53
53
  context 'and it exists in #available_status_messages' do
54
54
  it 'pushes the associated message to #status_messages' do
55
55
  subject.add_status_message :suspending
56
- subject.status_messages.should == [subject.available_status_messages[:suspending]]
56
+ expect(subject.status_messages).to eq([subject.available_status_messages[:suspending]])
57
57
  end
58
58
  end
59
59
 
@@ -69,7 +69,7 @@ describe Arachni::State::Framework do
69
69
  it 'uses them to fill in the placeholders' do
70
70
  location = '/blah/stuff.afs'
71
71
  subject.add_status_message :snapshot_location, location
72
- subject.status_messages.should == [subject.available_status_messages[:snapshot_location] % location]
72
+ expect(subject.status_messages).to eq([subject.available_status_messages[:snapshot_location] % location])
73
73
  end
74
74
  end
75
75
  end
@@ -80,12 +80,12 @@ describe Arachni::State::Framework do
80
80
  let(:statistics) { subject.statistics }
81
81
 
82
82
  it 'includes #rpc statistics' do
83
- statistics[:rpc].should == subject.rpc.statistics
83
+ expect(statistics[:rpc]).to eq(subject.rpc.statistics)
84
84
  end
85
85
 
86
86
  it 'includes #audited_page_count' do
87
87
  subject.audited_page_count += 1
88
- statistics[:audited_page_count].should == subject.audited_page_count
88
+ expect(statistics[:audited_page_count]).to eq(subject.audited_page_count)
89
89
  end
90
90
 
91
91
  it 'includes amount of #browser_skip_states' do
@@ -93,25 +93,25 @@ describe Arachni::State::Framework do
93
93
  set << 1 << 2 << 3
94
94
  subject.update_browser_skip_states( set )
95
95
 
96
- statistics[:browser_states].should == subject.browser_skip_states.size
96
+ expect(statistics[:browser_states]).to eq(subject.browser_skip_states.size)
97
97
  end
98
98
  end
99
99
 
100
100
  describe '#page_queue_filter' do
101
101
  it "returns an instance of #{Arachni::Support::LookUp::HashSet}" do
102
- subject.page_queue_filter.should be_kind_of Arachni::Support::LookUp::HashSet
102
+ expect(subject.page_queue_filter).to be_kind_of Arachni::Support::LookUp::HashSet
103
103
  end
104
104
  end
105
105
 
106
106
  describe '#url_queue_filter' do
107
107
  it "returns an instance of #{Arachni::Support::LookUp::HashSet}" do
108
- subject.url_queue_filter.should be_kind_of Arachni::Support::LookUp::HashSet
108
+ expect(subject.url_queue_filter).to be_kind_of Arachni::Support::LookUp::HashSet
109
109
  end
110
110
  end
111
111
 
112
112
  describe '#rpc' do
113
113
  it "returns an instance of #{described_class::RPC}" do
114
- subject.rpc.should be_kind_of described_class::RPC
114
+ expect(subject.rpc).to be_kind_of described_class::RPC
115
115
  end
116
116
  end
117
117
 
@@ -119,13 +119,13 @@ describe Arachni::State::Framework do
119
119
  context 'when an element has already been checked' do
120
120
  it 'returns true' do
121
121
  subject.element_pre_check_filter << element
122
- subject.element_checked?( element ).should be_true
122
+ expect(subject.element_checked?( element )).to be_truthy
123
123
  end
124
124
  end
125
125
 
126
126
  context 'when an element has not been checked' do
127
127
  it 'returns false' do
128
- subject.element_checked?( element ).should be_false
128
+ expect(subject.element_checked?( element )).to be_falsey
129
129
  end
130
130
  end
131
131
  end
@@ -133,7 +133,7 @@ describe Arachni::State::Framework do
133
133
  describe '#element_checked' do
134
134
  it 'marks an element as checked' do
135
135
  subject.element_checked element
136
- subject.element_checked?( element ).should be_true
136
+ expect(subject.element_checked?( element )).to be_truthy
137
137
  end
138
138
  end
139
139
 
@@ -141,13 +141,13 @@ describe Arachni::State::Framework do
141
141
  context 'when a page has already been seen' do
142
142
  it 'returns true' do
143
143
  subject.page_queue_filter << page
144
- subject.page_seen?( page ).should be_true
144
+ expect(subject.page_seen?( page )).to be_truthy
145
145
  end
146
146
  end
147
147
 
148
148
  context 'when a page has not been seen' do
149
149
  it 'returns false' do
150
- subject.page_seen?( page ).should be_false
150
+ expect(subject.page_seen?( page )).to be_falsey
151
151
  end
152
152
  end
153
153
  end
@@ -156,13 +156,13 @@ describe Arachni::State::Framework do
156
156
  context 'when the given page has been marked as seen' do
157
157
  it 'returns true' do
158
158
  subject.page_seen page
159
- subject.page_seen?( page ).should be_true
159
+ expect(subject.page_seen?( page )).to be_truthy
160
160
  end
161
161
  end
162
162
 
163
163
  context 'when the given page has not been marked as seen' do
164
164
  it 'returns false' do
165
- subject.page_seen?( page ).should be_false
165
+ expect(subject.page_seen?( page )).to be_falsey
166
166
  end
167
167
  end
168
168
  end
@@ -171,13 +171,13 @@ describe Arachni::State::Framework do
171
171
  context 'when a URL has already been seen' do
172
172
  it 'returns true' do
173
173
  subject.url_queue_filter << url
174
- subject.url_seen?( url ).should be_true
174
+ expect(subject.url_seen?( url )).to be_truthy
175
175
  end
176
176
  end
177
177
 
178
178
  context 'when a page has not been seen' do
179
179
  it 'returns false' do
180
- subject.url_seen?( url ).should be_false
180
+ expect(subject.url_seen?( url )).to be_falsey
181
181
  end
182
182
  end
183
183
  end
@@ -186,23 +186,23 @@ describe Arachni::State::Framework do
186
186
  context 'when the given URL has been marked as seen' do
187
187
  it 'returns true' do
188
188
  subject.url_seen url
189
- subject.url_seen?( url ).should be_true
189
+ expect(subject.url_seen?( url )).to be_truthy
190
190
  end
191
191
  end
192
192
 
193
193
  context 'when the given URL has not been marked as seen' do
194
194
  it 'returns false' do
195
- subject.url_seen?( url ).should be_false
195
+ expect(subject.url_seen?( url )).to be_falsey
196
196
  end
197
197
  end
198
198
  end
199
199
 
200
200
  describe '#running=' do
201
201
  it 'sets #running' do
202
- subject.running.should be_false
202
+ expect(subject.running).to be_falsey
203
203
 
204
204
  subject.running = true
205
- subject.running.should be_true
205
+ expect(subject.running).to be_truthy
206
206
  end
207
207
  end
208
208
 
@@ -210,14 +210,14 @@ describe Arachni::State::Framework do
210
210
  context 'when #running is true' do
211
211
  it 'returns true' do
212
212
  subject.running = true
213
- subject.should be_running
213
+ expect(subject).to be_running
214
214
  end
215
215
  end
216
216
 
217
217
  context 'when #running is false' do
218
218
  it 'returns false' do
219
219
  subject.running = false
220
- subject.should_not be_running
220
+ expect(subject).not_to be_running
221
221
  end
222
222
  end
223
223
  end
@@ -226,13 +226,13 @@ describe Arachni::State::Framework do
226
226
  context 'when the status is set to :scanning' do
227
227
  it 'returns true' do
228
228
  subject.status = :scanning
229
- subject.should be_scanning
229
+ expect(subject).to be_scanning
230
230
  end
231
231
  end
232
232
 
233
233
  context 'when the status is not set to :scanning' do
234
234
  it 'returns false' do
235
- subject.should_not be_scanning
235
+ expect(subject).not_to be_scanning
236
236
  end
237
237
  end
238
238
  end
@@ -250,7 +250,7 @@ describe Arachni::State::Framework do
250
250
 
251
251
  time = Time.now
252
252
  subject.suspend
253
- (Time.now - time).should > 1
253
+ expect(Time.now - time).to be > 1
254
254
  t.join
255
255
  end
256
256
 
@@ -262,7 +262,7 @@ describe Arachni::State::Framework do
262
262
  subject.suspend
263
263
  t.join
264
264
 
265
- subject.status.should == :suspended
265
+ expect(subject.status).to eq(:suspended)
266
266
  end
267
267
 
268
268
  it 'sets the status message to :suspending' do
@@ -273,8 +273,9 @@ describe Arachni::State::Framework do
273
273
  subject.suspend
274
274
  t.join
275
275
 
276
- subject.status_messages.should ==
276
+ expect(subject.status_messages).to eq(
277
277
  [subject.available_status_messages[:suspending]]
278
+ )
278
279
  end
279
280
 
280
281
  it 'returns true' do
@@ -282,45 +283,46 @@ describe Arachni::State::Framework do
282
283
  sleep 1
283
284
  subject.suspended
284
285
  end
285
- subject.suspend.should be_true
286
+ expect(subject.suspend).to be_truthy
286
287
  t.join
287
288
 
288
- subject.status.should == :suspended
289
+ expect(subject.status).to eq(:suspended)
289
290
  end
290
291
  end
291
292
 
292
293
  context 'when non-blocking' do
293
294
  it 'sets the #status to :suspending' do
294
295
  subject.suspend( false )
295
- subject.status.should == :suspending
296
+ expect(subject.status).to eq(:suspending)
296
297
  end
297
298
 
298
299
  it 'sets the status message to :suspending' do
299
300
  subject.suspend( false )
300
- subject.status_messages.should ==
301
+ expect(subject.status_messages).to eq(
301
302
  [subject.available_status_messages[:suspending]]
303
+ )
302
304
  end
303
305
 
304
306
  it 'returns true' do
305
- subject.suspend( false ).should be_true
307
+ expect(subject.suspend( false )).to be_truthy
306
308
  end
307
309
  end
308
310
 
309
311
  context 'when already #suspending?' do
310
312
  it 'returns false' do
311
- subject.suspend( false ).should be_true
312
- subject.should be_suspending
313
- subject.suspend.should be_false
313
+ expect(subject.suspend( false )).to be_truthy
314
+ expect(subject).to be_suspending
315
+ expect(subject.suspend).to be_falsey
314
316
  end
315
317
  end
316
318
 
317
319
  context 'when already #suspended?' do
318
320
  it 'returns false' do
319
- subject.suspend( false ).should be_true
321
+ expect(subject.suspend( false )).to be_truthy
320
322
  subject.suspended
321
- subject.should be_suspended
323
+ expect(subject).to be_suspended
322
324
 
323
- subject.suspend.should be_false
325
+ expect(subject.suspend).to be_falsey
324
326
  end
325
327
  end
326
328
 
@@ -352,7 +354,7 @@ describe Arachni::State::Framework do
352
354
  describe '#suspended' do
353
355
  it 'sets the #status to :suspended' do
354
356
  subject.suspended
355
- subject.status.should == :suspended
357
+ expect(subject.status).to eq(:suspended)
356
358
  end
357
359
  end
358
360
 
@@ -360,13 +362,13 @@ describe Arachni::State::Framework do
360
362
  context 'when #suspended' do
361
363
  it 'returns true' do
362
364
  subject.suspended
363
- subject.should be_suspended
365
+ expect(subject).to be_suspended
364
366
  end
365
367
  end
366
368
 
367
369
  context 'when not #suspended' do
368
370
  it 'returns false' do
369
- subject.should_not be_suspended
371
+ expect(subject).not_to be_suspended
370
372
  end
371
373
  end
372
374
  end
@@ -377,17 +379,17 @@ describe Arachni::State::Framework do
377
379
  context 'while suspending' do
378
380
  it 'returns true' do
379
381
  subject.suspend( false )
380
- subject.should be_suspending
382
+ expect(subject).to be_suspending
381
383
  end
382
384
  end
383
385
 
384
386
  context 'while not suspending' do
385
387
  it 'returns false' do
386
- subject.should_not be_suspending
388
+ expect(subject).not_to be_suspending
387
389
 
388
390
  subject.suspend( false )
389
391
  subject.suspended
390
- subject.should_not be_suspending
392
+ expect(subject).not_to be_suspending
391
393
  end
392
394
  end
393
395
  end
@@ -398,17 +400,17 @@ describe Arachni::State::Framework do
398
400
  context 'when a #suspend signal is in place' do
399
401
  it 'returns true' do
400
402
  subject.suspend( false )
401
- subject.should be_suspend
403
+ expect(subject).to be_suspend
402
404
  end
403
405
  end
404
406
 
405
407
  context 'when a #suspend signal is not in place' do
406
408
  it 'returns false' do
407
- subject.should_not be_suspend
409
+ expect(subject).not_to be_suspend
408
410
 
409
411
  subject.suspend( false )
410
412
  subject.suspended
411
- subject.should_not be_suspend
413
+ expect(subject).not_to be_suspend
412
414
  end
413
415
  end
414
416
  end
@@ -426,7 +428,7 @@ describe Arachni::State::Framework do
426
428
 
427
429
  time = Time.now
428
430
  subject.abort
429
- (Time.now - time).should > 1
431
+ expect(Time.now - time).to be > 1
430
432
  t.join
431
433
  end
432
434
 
@@ -438,7 +440,7 @@ describe Arachni::State::Framework do
438
440
  subject.abort
439
441
  t.join
440
442
 
441
- subject.status.should == :aborted
443
+ expect(subject.status).to eq(:aborted)
442
444
  end
443
445
 
444
446
  it 'sets the status message to :aborting' do
@@ -449,8 +451,9 @@ describe Arachni::State::Framework do
449
451
  subject.abort
450
452
  t.join
451
453
 
452
- subject.status_messages.should ==
454
+ expect(subject.status_messages).to eq(
453
455
  [subject.available_status_messages[:aborting]]
456
+ )
454
457
  end
455
458
 
456
459
  it 'returns true' do
@@ -458,45 +461,46 @@ describe Arachni::State::Framework do
458
461
  sleep 1
459
462
  subject.aborted
460
463
  end
461
- subject.abort.should be_true
464
+ expect(subject.abort).to be_truthy
462
465
  t.join
463
466
 
464
- subject.status.should == :aborted
467
+ expect(subject.status).to eq(:aborted)
465
468
  end
466
469
  end
467
470
 
468
471
  context 'when non-blocking' do
469
472
  it 'sets the #status to :aborting' do
470
473
  subject.abort( false )
471
- subject.status.should == :aborting
474
+ expect(subject.status).to eq(:aborting)
472
475
  end
473
476
 
474
477
  it 'sets the status message to :aborting' do
475
478
  subject.abort( false )
476
- subject.status_messages.should ==
479
+ expect(subject.status_messages).to eq(
477
480
  [subject.available_status_messages[:aborting]]
481
+ )
478
482
  end
479
483
 
480
484
  it 'returns true' do
481
- subject.abort( false ).should be_true
485
+ expect(subject.abort( false )).to be_truthy
482
486
  end
483
487
  end
484
488
 
485
489
  context 'when already #aborting?' do
486
490
  it 'returns false' do
487
- subject.abort( false ).should be_true
488
- subject.should be_aborting
489
- subject.abort.should be_false
491
+ expect(subject.abort( false )).to be_truthy
492
+ expect(subject).to be_aborting
493
+ expect(subject.abort).to be_falsey
490
494
  end
491
495
  end
492
496
 
493
497
  context 'when already #aborted?' do
494
498
  it 'returns false' do
495
- subject.abort( false ).should be_true
499
+ expect(subject.abort( false )).to be_truthy
496
500
  subject.aborted
497
- subject.should be_aborted
501
+ expect(subject).to be_aborted
498
502
 
499
- subject.abort.should be_false
503
+ expect(subject.abort).to be_falsey
500
504
  end
501
505
  end
502
506
  end
@@ -512,13 +516,13 @@ describe Arachni::State::Framework do
512
516
  context 'when #status is :done' do
513
517
  it 'returns true' do
514
518
  subject.status = :done
515
- subject.should be_done
519
+ expect(subject).to be_done
516
520
  end
517
521
  end
518
522
 
519
523
  context 'when not done' do
520
524
  it 'returns false' do
521
- subject.should_not be_done
525
+ expect(subject).not_to be_done
522
526
  end
523
527
  end
524
528
  end
@@ -526,7 +530,7 @@ describe Arachni::State::Framework do
526
530
  describe '#aborted' do
527
531
  it 'sets the #status to :aborted' do
528
532
  subject.aborted
529
- subject.status.should == :aborted
533
+ expect(subject.status).to eq(:aborted)
530
534
  end
531
535
  end
532
536
 
@@ -534,13 +538,13 @@ describe Arachni::State::Framework do
534
538
  context 'when #aborted' do
535
539
  it 'returns true' do
536
540
  subject.aborted
537
- subject.should be_aborted
541
+ expect(subject).to be_aborted
538
542
  end
539
543
  end
540
544
 
541
545
  context 'when not #aborted' do
542
546
  it 'returns false' do
543
- subject.should_not be_aborted
547
+ expect(subject).not_to be_aborted
544
548
  end
545
549
  end
546
550
  end
@@ -551,17 +555,17 @@ describe Arachni::State::Framework do
551
555
  context 'while aborting' do
552
556
  it 'returns true' do
553
557
  subject.abort( false )
554
- subject.should be_aborting
558
+ expect(subject).to be_aborting
555
559
  end
556
560
  end
557
561
 
558
562
  context 'while not aborting' do
559
563
  it 'returns false' do
560
- subject.should_not be_aborting
564
+ expect(subject).not_to be_aborting
561
565
 
562
566
  subject.abort( false )
563
567
  subject.aborted
564
- subject.should_not be_aborting
568
+ expect(subject).not_to be_aborting
565
569
  end
566
570
  end
567
571
  end
@@ -572,17 +576,17 @@ describe Arachni::State::Framework do
572
576
  context 'when a #abort signal is in place' do
573
577
  it 'returns true' do
574
578
  subject.abort( false )
575
- subject.should be_abort
579
+ expect(subject).to be_abort
576
580
  end
577
581
  end
578
582
 
579
583
  context 'when a #abort signal is not in place' do
580
584
  it 'returns false' do
581
- subject.should_not be_abort
585
+ expect(subject).not_to be_abort
582
586
 
583
587
  subject.abort( false )
584
588
  subject.aborted
585
- subject.should_not be_abort
589
+ expect(subject).not_to be_abort
586
590
  end
587
591
  end
588
592
  end
@@ -600,7 +604,7 @@ describe Arachni::State::Framework do
600
604
 
601
605
  time = Time.now
602
606
  subject.pause :a_caller
603
- (Time.now - time).should > 1
607
+ expect(Time.now - time).to be > 1
604
608
  t.join
605
609
  end
606
610
 
@@ -612,7 +616,7 @@ describe Arachni::State::Framework do
612
616
  subject.pause :a_caller
613
617
  t.join
614
618
 
615
- subject.status.should == :paused
619
+ expect(subject.status).to eq(:paused)
616
620
  end
617
621
 
618
622
  it 'returns true' do
@@ -620,21 +624,21 @@ describe Arachni::State::Framework do
620
624
  sleep 1
621
625
  subject.paused
622
626
  end
623
- subject.pause( :a_caller ).should be_true
627
+ expect(subject.pause( :a_caller )).to be_truthy
624
628
  t.join
625
629
 
626
- subject.status.should == :paused
630
+ expect(subject.status).to eq(:paused)
627
631
  end
628
632
  end
629
633
 
630
634
  context 'when non-blocking' do
631
635
  it 'sets the #status to :pausing' do
632
636
  subject.pause( :a_caller, false )
633
- subject.status.should == :pausing
637
+ expect(subject.status).to eq(:pausing)
634
638
  end
635
639
 
636
640
  it 'returns true' do
637
- subject.pause( :a_caller, false ).should be_true
641
+ expect(subject.pause( :a_caller, false )).to be_truthy
638
642
  end
639
643
  end
640
644
  end
@@ -650,8 +654,8 @@ describe Arachni::State::Framework do
650
654
 
651
655
  time = Time.now
652
656
  subject.pause :a_caller, false
653
- subject.status.should == :paused
654
- (Time.now - time).should < 1
657
+ expect(subject.status).to eq(:paused)
658
+ expect(Time.now - time).to be < 1
655
659
  t.join
656
660
  end
657
661
  end
@@ -660,7 +664,7 @@ describe Arachni::State::Framework do
660
664
  describe '#paused' do
661
665
  it 'sets the #status to :paused' do
662
666
  subject.paused
663
- subject.status.should == :paused
667
+ expect(subject.status).to eq(:paused)
664
668
  end
665
669
  end
666
670
 
@@ -670,17 +674,17 @@ describe Arachni::State::Framework do
670
674
  context 'while pausing' do
671
675
  it 'returns true' do
672
676
  subject.pause( :caller, false )
673
- subject.should be_pausing
677
+ expect(subject).to be_pausing
674
678
  end
675
679
  end
676
680
 
677
681
  context 'while not pausing' do
678
682
  it 'returns false' do
679
- subject.should_not be_pausing
683
+ expect(subject).not_to be_pausing
680
684
 
681
685
  subject.pause( :caller, false )
682
686
  subject.paused
683
- subject.should_not be_pausing
687
+ expect(subject).not_to be_pausing
684
688
  end
685
689
  end
686
690
  end
@@ -689,18 +693,18 @@ describe Arachni::State::Framework do
689
693
  context 'when a #pause signal is in place' do
690
694
  it 'returns true' do
691
695
  subject.pause( :caller, false )
692
- subject.should be_pause
696
+ expect(subject).to be_pause
693
697
  end
694
698
  end
695
699
 
696
700
  context 'when a #pause signal is not in place' do
697
701
  it 'returns false' do
698
- subject.should_not be_pause
702
+ expect(subject).not_to be_pause
699
703
 
700
704
  subject.pause( :caller, false )
701
705
  subject.paused
702
706
  subject.resume( :caller )
703
- subject.should_not be_pause
707
+ expect(subject).not_to be_pause
704
708
  end
705
709
  end
706
710
  end
@@ -710,12 +714,12 @@ describe Arachni::State::Framework do
710
714
 
711
715
  it 'removes a #pause signal' do
712
716
  subject.pause( :caller, false )
713
- subject.pause_signals.should include :caller
717
+ expect(subject.pause_signals).to include :caller
714
718
 
715
719
  subject.resume( :caller )
716
720
 
717
- subject.pause_signals.should_not include :caller
718
- subject.should_not be_paused
721
+ expect(subject.pause_signals).not_to include :caller
722
+ expect(subject).not_to be_paused
719
723
  end
720
724
 
721
725
  it 'operates on a per-caller basis' do
@@ -726,10 +730,10 @@ describe Arachni::State::Framework do
726
730
  subject.pause( :caller2, false )
727
731
 
728
732
  subject.resume( :caller )
729
- subject.should be_paused
733
+ expect(subject).to be_paused
730
734
 
731
735
  subject.resume( :caller2 )
732
- subject.should_not be_paused
736
+ expect(subject).not_to be_paused
733
737
  end
734
738
 
735
739
  it 'restores the previous #status' do
@@ -747,13 +751,13 @@ describe Arachni::State::Framework do
747
751
  it '#pause? returns false' do
748
752
  subject.pause( :caller, false )
749
753
  subject.resume( :caller )
750
- subject.should_not be_pause
754
+ expect(subject).not_to be_pause
751
755
  end
752
756
 
753
757
  it '#paused? returns false' do
754
758
  subject.pause( :caller, false )
755
759
  subject.resume( :caller )
756
- subject.should_not be_paused
760
+ expect(subject).not_to be_paused
757
761
  end
758
762
  end
759
763
 
@@ -762,7 +766,7 @@ describe Arachni::State::Framework do
762
766
  subject.pause( :caller, false )
763
767
  subject.paused
764
768
 
765
- subject.resume( :caller ).should be_true
769
+ expect(subject.resume( :caller )).to be_truthy
766
770
  end
767
771
  end
768
772
 
@@ -772,32 +776,32 @@ describe Arachni::State::Framework do
772
776
  subject.pause( :caller2, false )
773
777
  subject.paused
774
778
 
775
- subject.resume( :caller ).should be_false
779
+ expect(subject.resume( :caller )).to be_falsey
776
780
  end
777
781
  end
778
782
  end
779
783
 
780
784
  describe '#browser_skip_states' do
781
785
  it "returns a #{Arachni::Support::LookUp::HashSet}" do
782
- subject.browser_skip_states.should be_kind_of Arachni::Support::LookUp::HashSet
786
+ expect(subject.browser_skip_states).to be_kind_of Arachni::Support::LookUp::HashSet
783
787
  end
784
788
  end
785
789
 
786
790
  describe '#update_browser_skip_states' do
787
791
  it 'updates #browser_skip_states' do
788
- subject.browser_skip_states.should be_empty
792
+ expect(subject.browser_skip_states).to be_empty
789
793
 
790
794
  set = Arachni::Support::LookUp::HashSet.new
791
795
  set << 1 << 2 << 3
792
796
  subject.update_browser_skip_states( set )
793
- subject.browser_skip_states.should == set
797
+ expect(subject.browser_skip_states).to eq(set)
794
798
  end
795
799
  end
796
800
 
797
801
  describe '#dump' do
798
802
  it 'stores #rpc to disk' do
799
803
  subject.dump( dump_directory )
800
- described_class::RPC.load( "#{dump_directory}/rpc" ).should be_kind_of described_class::RPC
804
+ expect(described_class::RPC.load( "#{dump_directory}/rpc" )).to be_kind_of described_class::RPC
801
805
  end
802
806
 
803
807
  it 'stores #page_queue_filter to disk' do
@@ -805,8 +809,8 @@ describe Arachni::State::Framework do
805
809
 
806
810
  subject.dump( dump_directory )
807
811
 
808
- Marshal.load( IO.read( "#{dump_directory}/page_queue_filter" ) ).
809
- collection.should == Set.new([page.persistent_hash])
812
+ expect(Marshal.load( IO.read( "#{dump_directory}/page_queue_filter" ) ).
813
+ collection).to eq(Set.new([page.persistent_hash]))
810
814
  end
811
815
 
812
816
  it 'stores #url_queue_filter to disk' do
@@ -814,8 +818,8 @@ describe Arachni::State::Framework do
814
818
 
815
819
  subject.dump( dump_directory )
816
820
 
817
- Marshal.load( IO.read( "#{dump_directory}/url_queue_filter" ) ).
818
- collection.should == Set.new([url.persistent_hash])
821
+ expect(Marshal.load( IO.read( "#{dump_directory}/url_queue_filter" ) ).
822
+ collection).to eq(Set.new([url.persistent_hash]))
819
823
  end
820
824
 
821
825
  it 'stores #browser_skip_states to disk' do
@@ -827,14 +831,14 @@ describe Arachni::State::Framework do
827
831
  set = Arachni::Support::LookUp::HashSet.new( hasher: :persistent_hash)
828
832
  set << stuff
829
833
 
830
- Marshal.load( IO.read( "#{dump_directory}/browser_skip_states" ) ).should == set
834
+ expect(Marshal.load( IO.read( "#{dump_directory}/browser_skip_states" ) )).to eq(set)
831
835
  end
832
836
  end
833
837
 
834
838
  describe '.load' do
835
839
  it 'loads #rpc from disk' do
836
840
  subject.dump( dump_directory )
837
- described_class.load( dump_directory ).rpc.should be_kind_of described_class::RPC
841
+ expect(described_class.load( dump_directory ).rpc).to be_kind_of described_class::RPC
838
842
  end
839
843
 
840
844
  it 'loads #element_pre_check_filter from disk' do
@@ -842,8 +846,8 @@ describe Arachni::State::Framework do
842
846
 
843
847
  subject.dump( dump_directory )
844
848
 
845
- described_class.load( dump_directory ).element_pre_check_filter.
846
- collection.should == Set.new([element.coverage_hash])
849
+ expect(described_class.load( dump_directory ).element_pre_check_filter.
850
+ collection).to eq(Set.new([element.coverage_hash]))
847
851
  end
848
852
 
849
853
  it 'loads #page_queue_filter from disk' do
@@ -851,18 +855,18 @@ describe Arachni::State::Framework do
851
855
 
852
856
  subject.dump( dump_directory )
853
857
 
854
- described_class.load( dump_directory ).page_queue_filter.
855
- collection.should == Set.new([page.persistent_hash])
858
+ expect(described_class.load( dump_directory ).page_queue_filter.
859
+ collection).to eq(Set.new([page.persistent_hash]))
856
860
  end
857
861
 
858
862
  it 'loads #url_queue_filter from disk' do
859
863
  subject.url_queue_filter << url
860
- subject.url_queue_filter.should be_any
864
+ expect(subject.url_queue_filter).to be_any
861
865
 
862
866
  subject.dump( dump_directory )
863
867
 
864
- described_class.load( dump_directory ).url_queue_filter.
865
- collection.should == Set.new([url.persistent_hash])
868
+ expect(described_class.load( dump_directory ).url_queue_filter.
869
+ collection).to eq(Set.new([url.persistent_hash]))
866
870
  end
867
871
 
868
872
  it 'loads #browser_skip_states from disk' do
@@ -873,7 +877,7 @@ describe Arachni::State::Framework do
873
877
 
874
878
  set = Arachni::Support::LookUp::HashSet.new( hasher: :persistent_hash)
875
879
  set << stuff
876
- described_class.load( dump_directory ).browser_skip_states.should == set
880
+ expect(described_class.load( dump_directory ).browser_skip_states).to eq(set)
877
881
  end
878
882
  end
879
883
 
@@ -881,7 +885,7 @@ describe Arachni::State::Framework do
881
885
  %w(rpc element_pre_check_filter browser_skip_states page_queue_filter
882
886
  url_queue_filter).each do |method|
883
887
  it "clears ##{method}" do
884
- subject.send(method).should receive(:clear)
888
+ expect(subject.send(method)).to receive(:clear)
885
889
  subject.clear
886
890
  end
887
891
  end
@@ -889,7 +893,7 @@ describe Arachni::State::Framework do
889
893
  it 'sets #running to false' do
890
894
  subject.running = true
891
895
  subject.clear
892
- subject.should_not be_running
896
+ expect(subject).not_to be_running
893
897
  end
894
898
  end
895
899
  end