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
@@ -36,12 +36,12 @@ describe Arachni::Support::Database::Queue do
36
36
  consumed = []
37
37
  consumed << poped.pop while !poped.empty?
38
38
 
39
- consumed.sort.should == (0...entries).map { |i| 'a' * i }
39
+ expect(consumed.sort).to eq((0...entries).map { |i| 'a' * i })
40
40
  end
41
41
 
42
42
  describe "#{described_class}::DEFAULT_MAX_BUFFER_SIZE" do
43
43
  it 'returns 100' do
44
- described_class::DEFAULT_MAX_BUFFER_SIZE.should == 100
44
+ expect(described_class::DEFAULT_MAX_BUFFER_SIZE).to eq(100)
45
45
  end
46
46
  end
47
47
 
@@ -50,7 +50,7 @@ describe Arachni::Support::Database::Queue do
50
50
  subject << 1
51
51
  subject << 2
52
52
 
53
- subject.buffer.should == [1, 2]
53
+ expect(subject.buffer).to eq([1, 2])
54
54
  end
55
55
  end
56
56
 
@@ -60,9 +60,9 @@ describe Arachni::Support::Database::Queue do
60
60
  subject << 1
61
61
  subject << 2
62
62
 
63
- subject.disk.size.should == 2
63
+ expect(subject.disk.size).to eq(2)
64
64
  subject.disk.each do |path|
65
- File.exists?( path ).should be_true
65
+ expect(File.exists?( path )).to be_truthy
66
66
  end
67
67
  end
68
68
  end
@@ -70,7 +70,7 @@ describe Arachni::Support::Database::Queue do
70
70
  describe '#max_buffer_size' do
71
71
  context 'by default' do
72
72
  it "returns #{described_class}::DEFAULT_MAX_BUFFER_SIZE" do
73
- subject.max_buffer_size.should == described_class::DEFAULT_MAX_BUFFER_SIZE
73
+ expect(subject.max_buffer_size).to eq(described_class::DEFAULT_MAX_BUFFER_SIZE)
74
74
  end
75
75
  end
76
76
  end
@@ -78,21 +78,21 @@ describe Arachni::Support::Database::Queue do
78
78
  describe '#max_buffer_size=' do
79
79
  it 'sets #max_buffer_size' do
80
80
  subject.max_buffer_size = 10
81
- subject.max_buffer_size.should == 10
81
+ expect(subject.max_buffer_size).to eq(10)
82
82
  end
83
83
  end
84
84
 
85
85
  describe '#empty?' do
86
86
  context 'when the queue is empty' do
87
87
  it 'returns true' do
88
- subject.empty?.should be_true
88
+ expect(subject.empty?).to be_truthy
89
89
  end
90
90
  end
91
91
 
92
92
  context 'when the queue is not empty' do
93
93
  it 'returns false' do
94
94
  subject << :stuff
95
- subject.empty?.should be_false
95
+ expect(subject.empty?).to be_falsey
96
96
  end
97
97
  end
98
98
  end
@@ -104,7 +104,7 @@ describe Arachni::Support::Database::Queue do
104
104
  end
105
105
 
106
106
  sample_size.times do |i|
107
- subject.pop.should == "stuff #{i}"
107
+ expect(subject.pop).to eq("stuff #{i}")
108
108
  end
109
109
  end
110
110
  end
@@ -112,14 +112,14 @@ describe Arachni::Support::Database::Queue do
112
112
  describe '#push' do
113
113
  it 'pushes an object' do
114
114
  subject.push :stuff
115
- subject.pop.should == :stuff
115
+ expect(subject.pop).to eq(:stuff)
116
116
  end
117
117
  end
118
118
 
119
119
  describe '#enq' do
120
120
  it 'pushes an object' do
121
121
  subject.enq :stuff
122
- subject.pop.should == :stuff
122
+ expect(subject.pop).to eq(:stuff)
123
123
  end
124
124
  end
125
125
 
@@ -130,7 +130,7 @@ describe Arachni::Support::Database::Queue do
130
130
  end
131
131
 
132
132
  sample_size.times do |i|
133
- subject.pop.should == "stuff #{i}"
133
+ expect(subject.pop).to eq("stuff #{i}")
134
134
  end
135
135
  end
136
136
 
@@ -142,76 +142,76 @@ describe Arachni::Support::Database::Queue do
142
142
  Thread.new { subject << :stuff }
143
143
  t.join
144
144
 
145
- val.should == :stuff
145
+ expect(val).to eq(:stuff)
146
146
  end
147
147
  end
148
148
 
149
149
  describe '#deq' do
150
150
  it 'removes an object' do
151
151
  subject << :stuff
152
- subject.deq.should == :stuff
152
+ expect(subject.deq).to eq(:stuff)
153
153
  end
154
154
  end
155
155
 
156
156
  describe '#shift' do
157
157
  it 'removes an object' do
158
158
  subject << :stuff
159
- subject.shift.should == :stuff
159
+ expect(subject.shift).to eq(:stuff)
160
160
  end
161
161
  end
162
162
 
163
163
  describe '#size' do
164
164
  it 'returns the size of the queue' do
165
165
  sample_size.times { |i| subject << i }
166
- subject.size.should == sample_size
166
+ expect(subject.size).to eq(sample_size)
167
167
  end
168
168
  end
169
169
 
170
170
  describe '#free_buffer_size' do
171
171
  it 'returns the size of the available buffer' do
172
172
  (subject.max_buffer_size - 2).times { |i| subject << i }
173
- subject.free_buffer_size.should == 2
173
+ expect(subject.free_buffer_size).to eq(2)
174
174
  end
175
175
  end
176
176
 
177
177
  describe '#buffer_size' do
178
178
  it 'returns the size of the in-memory entries' do
179
- subject.buffer_size.should == 0
179
+ expect(subject.buffer_size).to eq(0)
180
180
 
181
181
  (subject.max_buffer_size - 1).times { |i| subject << i }
182
- subject.buffer_size.should == subject.max_buffer_size - 1
182
+ expect(subject.buffer_size).to eq(subject.max_buffer_size - 1)
183
183
 
184
184
  subject.clear
185
185
 
186
186
  sample_size.times { |i| subject << i }
187
- subject.buffer_size.should == subject.max_buffer_size
187
+ expect(subject.buffer_size).to eq(subject.max_buffer_size)
188
188
  end
189
189
  end
190
190
 
191
191
  describe '#disk_size' do
192
192
  it 'returns the size of the disk entries' do
193
- subject.buffer_size.should == 0
193
+ expect(subject.buffer_size).to eq(0)
194
194
 
195
195
  (subject.max_buffer_size + 1).times { |i| subject << i }
196
- subject.disk_size.should == 1
196
+ expect(subject.disk_size).to eq(1)
197
197
 
198
198
  subject.clear
199
199
 
200
200
  sample_size.times { |i| subject << i }
201
- subject.disk_size.should == sample_size - subject.max_buffer_size
201
+ expect(subject.disk_size).to eq(sample_size - subject.max_buffer_size)
202
202
  end
203
203
  end
204
204
 
205
205
  describe '#num_waiting' do
206
206
  it 'returns the amount of threads waiting to pop' do
207
- subject.num_waiting.should == 0
207
+ expect(subject.num_waiting).to eq(0)
208
208
 
209
209
  2.times do
210
210
  Thread.new { subject.pop }
211
211
  end
212
212
  sleep 0.1
213
213
 
214
- subject.num_waiting.should == 2
214
+ expect(subject.num_waiting).to eq(2)
215
215
  end
216
216
  end
217
217
 
@@ -219,7 +219,7 @@ describe Arachni::Support::Database::Queue do
219
219
  it 'empties the queue' do
220
220
  sample_size.times { |i| subject << i }
221
221
  subject.clear
222
- subject.size.should == 0
222
+ expect(subject.size).to eq(0)
223
223
  end
224
224
  end
225
225
 
@@ -11,8 +11,8 @@ describe Arachni::Support::LookUp::HashSet do
11
11
  new << 'test2'
12
12
 
13
13
  subject.merge new
14
- subject.should include 'test'
15
- subject.should include 'test2'
14
+ expect(subject).to include 'test'
15
+ expect(subject).to include 'test2'
16
16
  end
17
17
  end
18
18
 
@@ -24,8 +24,8 @@ describe Arachni::Support::LookUp::HashSet do
24
24
  new << 'test2'
25
25
 
26
26
  subject.replace new
27
- subject.should include 'test2'
28
- subject.should_not include 'test'
27
+ expect(subject).to include 'test2'
28
+ expect(subject).not_to include 'test'
29
29
  end
30
30
  end
31
31
 
@@ -42,13 +42,13 @@ describe Arachni::Support::LookUp::HashSet do
42
42
 
43
43
  context 'when the set is a superset of another set' do
44
44
  it 'returns true' do
45
- new.should be_superset subject
45
+ expect(new).to be_superset subject
46
46
  end
47
47
  end
48
48
 
49
49
  context 'when the set is not a superset of another set' do
50
50
  it 'returns true' do
51
- subject.should be_superset new
51
+ expect(subject).to be_superset new
52
52
  end
53
53
  end
54
54
  end
@@ -66,13 +66,13 @@ describe Arachni::Support::LookUp::HashSet do
66
66
 
67
67
  context 'when the set is a subset of another set' do
68
68
  it 'returns true' do
69
- subject.should be_subset new
69
+ expect(subject).to be_subset new
70
70
  end
71
71
  end
72
72
 
73
73
  context 'when the set is not a subset of another set' do
74
74
  it 'returns true' do
75
- new.should be_subset subject
75
+ expect(new).to be_subset subject
76
76
  end
77
77
  end
78
78
  end
@@ -17,10 +17,10 @@ describe Arachni::Support::LookUp::Moolb do
17
17
  lu << i
18
18
  end
19
19
 
20
- lu.include?( 0 ).should be_false
20
+ expect(lu.include?( 0 )).to be_falsey
21
21
 
22
22
  1.upto( 3 ) do |i|
23
- lu.include?( i ).should be_true
23
+ expect(lu.include?( i )).to be_truthy
24
24
  end
25
25
  end
26
26
  end
@@ -34,7 +34,7 @@ describe Arachni::Support::LookUp::Moolb do
34
34
  lu << i
35
35
  end
36
36
 
37
- lu.size.should == 3
37
+ expect(lu.size).to eq(3)
38
38
  end
39
39
  end
40
40
  end
@@ -23,11 +23,11 @@ describe Arachni::Support::Mixins::Observable do
23
23
  subject.my_event { called = true }
24
24
  subject.notify :my_event
25
25
 
26
- called.should be_true
26
+ expect(called).to be_truthy
27
27
  end
28
28
 
29
29
  it 'returns self' do
30
- subject.my_event { }.should == subject
30
+ expect(subject.my_event { }).to eq(subject)
31
31
  end
32
32
 
33
33
  context 'when no block is given' do
@@ -46,7 +46,7 @@ describe Arachni::Support::Mixins::Observable do
46
46
  end
47
47
  subject.notify :my_other_event, sent_args
48
48
 
49
- received_args.should == sent_args
49
+ expect(received_args).to eq(sent_args)
50
50
  end
51
51
  end
52
52
 
@@ -60,7 +60,7 @@ describe Arachni::Support::Mixins::Observable do
60
60
  describe '#notify' do
61
61
  it 'returns nil' do
62
62
  subject.my_event { }
63
- subject.notify( :my_event ).should be_nil
63
+ expect(subject.notify( :my_event )).to be_nil
64
64
  end
65
65
 
66
66
  context 'when a callback raises an exception' do
@@ -73,7 +73,7 @@ describe Arachni::Support::Mixins::Observable do
73
73
 
74
74
  subject.notify( :my_event )
75
75
 
76
- called.should == [1, 2, 3]
76
+ expect(called).to eq([1, 2, 3])
77
77
  end
78
78
  end
79
79
  end
@@ -87,7 +87,7 @@ describe Arachni::Support::Mixins::Observable do
87
87
 
88
88
  subject.notify :my_event
89
89
 
90
- called.should be_false
90
+ expect(called).to be_falsey
91
91
 
92
92
  end
93
93
  end
@@ -26,19 +26,19 @@ describe Arachni::Support::Signature do
26
26
 
27
27
  s = described_class.new( seed1, threshold: 0.01 )
28
28
  s1 = described_class.new( seed2 )
29
- s.should_not be_similar s1
29
+ expect(s).not_to be_similar s1
30
30
 
31
31
  s = described_class.new( seed1, threshold: 0.1 )
32
32
  s1 = described_class.new( seed2 )
33
- s.should_not be_similar s1
33
+ expect(s).not_to be_similar s1
34
34
 
35
35
  s = described_class.new( seed1, threshold: 0.7 )
36
36
  s1 = described_class.new( seed2 )
37
- s.should be_similar s1
37
+ expect(s).to be_similar s1
38
38
 
39
39
  s = described_class.new( seed1, threshold: 1 )
40
40
  s1 = described_class.new( seed2 )
41
- s.should be_similar s1
41
+ expect(s).to be_similar s1
42
42
  end
43
43
 
44
44
  context 'when not a number' do
@@ -54,7 +54,7 @@ describe Arachni::Support::Signature do
54
54
 
55
55
  describe '#refine' do
56
56
  it 'removes noise from the signature' do
57
- string_with_noise.should_not == string_with_noise
57
+ expect(string_with_noise).not_to eq(string_with_noise)
58
58
 
59
59
  signature1 = described_class.new( string_with_noise )
60
60
 
@@ -63,18 +63,18 @@ describe Arachni::Support::Signature do
63
63
  signature2 = described_class.new( string_with_noise )
64
64
  10.times{ signature2 = signature2.refine( string_with_noise ) }
65
65
 
66
- signature1.should == signature2
66
+ expect(signature1).to eq(signature2)
67
67
  end
68
68
 
69
69
  it 'returns a new signature instance' do
70
70
  signature1 = described_class.new( string_with_noise )
71
- signature1.refine( string_with_noise ).object_id.should_not == signature1.object_id
71
+ expect(signature1.refine( string_with_noise ).object_id).not_to eq(signature1.object_id)
72
72
  end
73
73
  end
74
74
 
75
75
  describe '#refine!' do
76
76
  it 'destructively removes noise from the signature' do
77
- string_with_noise.should_not == string_with_noise
77
+ expect(string_with_noise).not_to eq(string_with_noise)
78
78
 
79
79
  signature1 = described_class.new( string_with_noise )
80
80
  10.times{ signature1.refine!( string_with_noise ) }
@@ -82,12 +82,12 @@ describe Arachni::Support::Signature do
82
82
  signature2 = described_class.new( string_with_noise )
83
83
  10.times{ signature2.refine!( string_with_noise ) }
84
84
 
85
- signature1.should == signature2
85
+ expect(signature1).to eq(signature2)
86
86
  end
87
87
 
88
88
  it 'returns self' do
89
89
  signature = described_class.new( string_with_noise )
90
- signature.refine!( string_with_noise ).object_id.should == signature.object_id
90
+ expect(signature.refine!( string_with_noise ).object_id).to eq(signature.object_id)
91
91
  end
92
92
  end
93
93
 
@@ -98,12 +98,12 @@ describe Arachni::Support::Signature do
98
98
  signature3 = described_class.new( different_string_with_noise )
99
99
  signature4 = described_class.new( different_string_with_noise )
100
100
 
101
- signature1.differences( signature2 ).round(3).should == 0.348
102
- signature2.differences( signature2 ).should == 0
101
+ expect(signature1.differences( signature2 ).round(3)).to eq(0.348)
102
+ expect(signature2.differences( signature2 )).to eq(0)
103
103
 
104
- signature3.differences( signature4 ).should == 0.2
105
- signature4.differences( signature4 ).should == 0
106
- signature1.differences( signature3 ).round(3).should == 0.667
104
+ expect(signature3.differences( signature4 )).to eq(0.2)
105
+ expect(signature4.differences( signature4 )).to eq(0)
106
+ expect(signature1.differences( signature3 ).round(3)).to eq(0.667)
107
107
  end
108
108
  end
109
109
 
@@ -116,7 +116,7 @@ describe Arachni::Support::Signature do
116
116
  signature2 = described_class.new( string_with_noise )
117
117
  10.times{ signature2.refine!( string_with_noise ) }
118
118
 
119
- signature1.should == signature2
119
+ expect(signature1).to eq(signature2)
120
120
  end
121
121
  end
122
122
 
@@ -128,15 +128,15 @@ describe Arachni::Support::Signature do
128
128
  signature2 = described_class.new( different_string_with_noise )
129
129
  10.times{ signature2.refine!( different_string_with_noise ) }
130
130
 
131
- signature1.should_not == signature2
131
+ expect(signature1).not_to eq(signature2)
132
132
  end
133
133
  end
134
134
  end
135
135
 
136
136
  describe '#dup' do
137
137
  it 'returns a duplicate instance' do
138
- signature.dup.should == signature
139
- signature.dup.object_id.should_not == signature.object_id
138
+ expect(signature.dup).to eq(signature)
139
+ expect(signature.dup.object_id).not_to eq(signature.object_id)
140
140
  end
141
141
  end
142
142
  end
@@ -76,43 +76,43 @@ describe Arachni::Trainer do
76
76
  describe 'HTTP requests with "train" set to' do
77
77
  describe 'nil' do
78
78
  it 'skips the Trainer' do
79
- @framework.pages.size.should == 0
79
+ expect(@framework.pages.size).to eq(0)
80
80
 
81
81
  Arachni::HTTP::Client.request( @url + '/elems' )
82
82
  @framework.run
83
83
 
84
- @framework.pages.size.should == 0
84
+ expect(@framework.pages.size).to eq(0)
85
85
  end
86
86
  end
87
87
  describe false do
88
88
  it 'skips the Trainer' do
89
- @framework.pages.size.should == 0
89
+ expect(@framework.pages.size).to eq(0)
90
90
 
91
91
  Arachni::HTTP::Client.request( @url + '/elems', train: false )
92
92
  @framework.run
93
93
 
94
- @framework.pages.size.should == 0
94
+ expect(@framework.pages.size).to eq(0)
95
95
  end
96
96
  end
97
97
  describe true do
98
98
  it 'passes the response to the Trainer' do
99
- @framework.pages.size.should == 0
99
+ expect(@framework.pages.size).to eq(0)
100
100
 
101
101
  Arachni::HTTP::Client.request( @url + '/elems', train: true )
102
102
 
103
- @trainer.should receive(:push)
103
+ expect(@trainer).to receive(:push)
104
104
  @framework.run
105
105
  end
106
106
 
107
107
  context 'when a redirection leads to new elements' do
108
108
  it 'passes the response to the Trainer' do
109
- @framework.pages.size.should == 0
109
+ expect(@framework.pages.size).to eq(0)
110
110
 
111
111
  Arachni::HTTP::Client.request( @url + '/train/redirect', train: true )
112
112
  @framework.run
113
113
 
114
114
  page = @framework.pages.first
115
- page.links.first.inputs.include?( 'msg' ).should be_true
115
+ expect(page.links.first.inputs.include?( 'msg' )).to be_truthy
116
116
  end
117
117
  end
118
118
  end
@@ -121,25 +121,25 @@ describe Arachni::Trainer do
121
121
  context 'when a page' do
122
122
  context 'has not changed' do
123
123
  it 'is skipped' do
124
- @framework.pages.should be_empty
124
+ expect(@framework.pages).to be_empty
125
125
 
126
126
  Arachni::HTTP::Client.request( @url, train: true )
127
127
  @framework.run
128
128
 
129
- @framework.pages.should be_empty
129
+ expect(@framework.pages).to be_empty
130
130
  end
131
131
 
132
132
  context 'but has new paths' do
133
133
  it 'pushes them to the framework' do
134
- @framework.urls.should be_empty
134
+ expect(@framework.urls).to be_empty
135
135
 
136
136
  Arachni::HTTP::Client.request( @url, train: true )
137
137
 
138
138
  Arachni::HTTP::Client.request( @url + '/new-paths', train: true )
139
139
  @framework.run
140
140
 
141
- @framework.pages.should be_empty
142
- @framework.urls.should be_any
141
+ expect(@framework.pages).to be_empty
142
+ expect(@framework.urls).to be_any
143
143
  end
144
144
  end
145
145
  end
@@ -162,7 +162,7 @@ describe Arachni::Trainer do
162
162
 
163
163
  100.times { @trainer.push( get_response.call ) }
164
164
 
165
- pages.size.should == Arachni::Trainer::MAX_TRAININGS_PER_URL
165
+ expect(pages.size).to eq(Arachni::Trainer::MAX_TRAININGS_PER_URL)
166
166
  end
167
167
  end
168
168
 
@@ -171,7 +171,7 @@ describe Arachni::Trainer do
171
171
  res = Arachni::HTTP::Response.new(
172
172
  url: @url + '/exclude_me'
173
173
  )
174
- @trainer.push( res ).should be_false
174
+ expect(@trainer.push( res )).to be_falsey
175
175
  end
176
176
  end
177
177
 
@@ -197,7 +197,7 @@ describe Arachni::Trainer do
197
197
  Arachni::Options.scope.redundant_path_patterns = { /match_this/ => 0 }
198
198
  trainer.push( get_response.call )
199
199
 
200
- pages.size.should == 0
200
+ expect(pages.size).to eq(0)
201
201
  end
202
202
  end
203
203
  end
@@ -207,9 +207,9 @@ describe Arachni::Trainer do
207
207
  it 'returns nil' do
208
208
  @trainer.page = @page
209
209
 
210
- @trainer.stub(:analyze) { raise }
210
+ allow(@trainer).to receive(:analyze) { raise }
211
211
 
212
- @trainer.push( request( @url ) ).should be_nil
212
+ expect(@trainer.push( request( @url ) )).to be_nil
213
213
  end
214
214
  end
215
215
 
@@ -218,7 +218,7 @@ describe Arachni::Trainer do
218
218
  @trainer.page = @page
219
219
 
220
220
  Arachni::Options.scope.exclude_path_patterns = @url
221
- @trainer.push( request( @url ) ).should be_false
221
+ expect(@trainer.push( request( @url ) )).to be_falsey
222
222
  end
223
223
  end
224
224
 
@@ -226,14 +226,14 @@ describe Arachni::Trainer do
226
226
  context 'text-based' do
227
227
  it 'returns true' do
228
228
  @trainer.page = @page
229
- @trainer.push( request( @url ) ).should be_true
229
+ expect(@trainer.push( request( @url ) )).to be_truthy
230
230
  end
231
231
  end
232
232
 
233
233
  context 'not text-based' do
234
234
  it 'returns false' do
235
235
  ct = @url + '/non_text_content_type'
236
- @trainer.push( request( ct ) ).should be_false
236
+ expect(@trainer.push( request( ct ) )).to be_falsey
237
237
  end
238
238
  end
239
239
  end
@@ -243,15 +243,15 @@ describe Arachni::Trainer do
243
243
  it 'returns a page with the new form' do
244
244
  url = @url + '/new_form'
245
245
  @trainer.page = @page
246
- @trainer.push( request( url ) ).should be_true
246
+ expect(@trainer.push( request( url ) )).to be_truthy
247
247
 
248
248
  pages = @framework.pages
249
- pages.size.should == 1
249
+ expect(pages.size).to eq(1)
250
250
 
251
251
  page = pages.pop
252
252
  new_forms = (page.forms - @page.forms)
253
- new_forms.size.should == 1
254
- new_forms.first.inputs.include?( 'input2' ).should be_true
253
+ expect(new_forms.size).to eq(1)
254
+ expect(new_forms.first.inputs.include?( 'input2' )).to be_truthy
255
255
  end
256
256
  end
257
257
 
@@ -259,13 +259,13 @@ describe Arachni::Trainer do
259
259
  it 'returns a page with the new link' do
260
260
  url = @url + '/new_link'
261
261
  @trainer.page = @page
262
- @trainer.push( request( url ) ).should be_true
262
+ expect(@trainer.push( request( url ) )).to be_truthy
263
263
 
264
264
  page = @framework.pages.first
265
265
 
266
266
  new_links = (page.links - @page.links)
267
- new_links.size.should == 1
268
- new_links.select { |l| l.inputs.include?( 'link_param' ) }.should be_any
267
+ expect(new_links.size).to eq(1)
268
+ expect(new_links.select { |l| l.inputs.include?( 'link_param' ) }).to be_any
269
269
  end
270
270
  end
271
271
 
@@ -273,11 +273,11 @@ describe Arachni::Trainer do
273
273
  it 'returns a page with the new cookie appended' do
274
274
  url = @url + '/new_cookie'
275
275
  @trainer.page = @page
276
- @trainer.push( request( url ) ).should be_true
276
+ expect(@trainer.push( request( url ) )).to be_truthy
277
277
 
278
278
  page = @framework.pages.first
279
- page.cookies.size.should == 2
280
- page.cookies.select { |l| l.inputs.include?( 'new_cookie' ) }.should be_any
279
+ expect(page.cookies.size).to eq(2)
280
+ expect(page.cookies.select { |l| l.inputs.include?( 'new_cookie' ) }).to be_any
281
281
  end
282
282
  end
283
283
  end
@@ -286,9 +286,9 @@ describe Arachni::Trainer do
286
286
  it 'extracts query vars from the effective url' do
287
287
  url = @url + '/redirect?redirected=true'
288
288
  @trainer.page = @page
289
- @trainer.push( request( url ) ).should be_true
289
+ expect(@trainer.push( request( url ) )).to be_truthy
290
290
  page = @framework.pages.first
291
- page.links.last.inputs['redirected'].should == 'true'
291
+ expect(page.links.last.inputs['redirected']).to eq('true')
292
292
  end
293
293
  end
294
294
 
@@ -310,28 +310,28 @@ describe Arachni::Trainer do
310
310
  let(:subject) { TrainerMockFramework.new.trainer }
311
311
 
312
312
  context true do
313
- before { TrainerMockFramework.any_instance.stub(:accepts_more_pages?){ true } }
313
+ before { allow_any_instance_of(TrainerMockFramework).to receive(:accepts_more_pages?){ true } }
314
314
 
315
315
  it 'processes pages' do
316
316
  pages = []
317
317
  subject.on_new_page { |p| pages << p }
318
318
 
319
- subject.push( get_response.call ).should be_true
319
+ expect(subject.push( get_response.call )).to be_truthy
320
320
 
321
- pages.size.should == 1
321
+ expect(pages.size).to eq(1)
322
322
  end
323
323
  end
324
324
 
325
325
  context false do
326
- before { TrainerMockFramework.any_instance.stub(:accepts_more_pages?){ false } }
326
+ before { allow_any_instance_of(TrainerMockFramework).to receive(:accepts_more_pages?){ false } }
327
327
 
328
328
  it 'does not process the page' do
329
329
  pages = []
330
330
  subject.on_new_page { |p| pages << p }
331
331
 
332
- subject.push( get_response.call ).should be_false
332
+ expect(subject.push( get_response.call )).to be_falsey
333
333
 
334
- pages.should be_empty
334
+ expect(pages).to be_empty
335
335
  end
336
336
  end
337
337
  end