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
@@ -11,8 +11,8 @@ describe Arachni::HTTP::CookieJar do
11
11
  it 'loads cookies from a Netscape cookie-jar file' do
12
12
  j = subject.class.from_file( cookiejar_file )
13
13
  cookies = j.cookies
14
- cookies.size.should == 4
15
- cookies.should == cookies
14
+ expect(cookies.size).to eq(4)
15
+ expect(cookies).to eq(cookies)
16
16
  end
17
17
 
18
18
  context 'when the provided file does not exist' do
@@ -29,15 +29,15 @@ describe Arachni::HTTP::CookieJar do
29
29
 
30
30
  describe '#initialize' do
31
31
  it 'returns a new instance' do
32
- Arachni::HTTP::CookieJar.new.is_a?( Arachni::HTTP::CookieJar ).should be_true
32
+ expect(Arachni::HTTP::CookieJar.new.is_a?( Arachni::HTTP::CookieJar )).to be_truthy
33
33
  end
34
34
 
35
35
  context 'when a cookiejer option has been provided' do
36
36
  it 'loads cookies from a Netscape cookie-jar file' do
37
37
  j = subject.class.from_file( cookiejar_file )
38
38
  cookies = j.cookies
39
- cookies.size.should == 4
40
- cookies.should == Arachni::Utilities.cookies_from_file( '', cookiejar_file )
39
+ expect(cookies.size).to eq(4)
40
+ expect(cookies).to eq(Arachni::Utilities.cookies_from_file( '', cookiejar_file ))
41
41
  end
42
42
  end
43
43
 
@@ -51,28 +51,28 @@ describe Arachni::HTTP::CookieJar do
51
51
  describe '#<<' do
52
52
  context 'when a cookie with that name does not already exist' do
53
53
  it 'adds the cookie to the jar' do
54
- subject.empty?.should be_true
54
+ expect(subject.empty?).to be_truthy
55
55
 
56
- (subject << cookie).should == subject
57
- subject.cookies.first.should == cookie
56
+ expect(subject << cookie).to eq(subject)
57
+ expect(subject.cookies.first).to eq(cookie)
58
58
 
59
- subject.empty?.should be_false
59
+ expect(subject.empty?).to be_falsey
60
60
  end
61
61
  end
62
62
  context 'when a cookie with that name already exists' do
63
63
  it 'updates the jar (i.e. replace the cookie)' do
64
- subject.empty?.should be_true
64
+ expect(subject.empty?).to be_truthy
65
65
 
66
- (subject << cookie).should == subject
67
- subject.cookies.first.should == cookie
66
+ expect(subject << cookie).to eq(subject)
67
+ expect(subject.cookies.first).to eq(cookie)
68
68
 
69
69
  c = cookie.dup
70
70
  c.inputs = { c.name => 'my val' }
71
71
 
72
- (subject << c).should == subject
73
- subject.cookies.first.should == c
72
+ expect(subject << c).to eq(subject)
73
+ expect(subject.cookies.first).to eq(c)
74
74
 
75
- subject.empty?.should be_false
75
+ expect(subject.empty?).to be_falsey
76
76
  end
77
77
  end
78
78
  end
@@ -80,26 +80,26 @@ describe Arachni::HTTP::CookieJar do
80
80
  describe '#update' do
81
81
  context 'when cookies with the same name do not already exist' do
82
82
  it 'adds the cookies to the jar' do
83
- subject.empty?.should be_true
83
+ expect(subject.empty?).to be_truthy
84
84
 
85
- subject.update( cookies ).should == subject
86
- subject.cookies.should == cookies
85
+ expect(subject.update( cookies )).to eq(subject)
86
+ expect(subject.cookies).to eq(cookies)
87
87
 
88
- subject.empty?.should be_false
88
+ expect(subject.empty?).to be_falsey
89
89
  end
90
90
  end
91
91
  context 'when cookies with the same name already exist' do
92
92
  it 'updates the jar (i.e. replace the cookies)' do
93
- subject.empty?.should be_true
93
+ expect(subject.empty?).to be_truthy
94
94
 
95
- subject.update( cookies ).should == subject
96
- subject.cookies.should == cookies
95
+ expect(subject.update( cookies )).to eq(subject)
96
+ expect(subject.cookies).to eq(cookies)
97
97
 
98
98
  c = cookies.dup.map { |dc| dc.inputs = { dc.name => dc.name + '-updated' }; dc }
99
- subject.update( c ).should == subject
100
- subject.cookies.should == c
99
+ expect(subject.update( c )).to eq(subject)
100
+ expect(subject.cookies).to eq(c)
101
101
 
102
- subject.empty?.should be_false
102
+ expect(subject.empty?).to be_falsey
103
103
  end
104
104
  end
105
105
 
@@ -108,61 +108,61 @@ describe Arachni::HTTP::CookieJar do
108
108
  it 'updates the cookie jar with it' do
109
109
  c = Arachni::Cookie.new( url: 'http://test.com', inputs: { name: 'value' } )
110
110
 
111
- subject.should be_empty
111
+ expect(subject).to be_empty
112
112
 
113
113
  subject.update( c )
114
- subject.cookies.first.name.should == 'name'
115
- subject.cookies.first.value.should == 'value'
114
+ expect(subject.cookies.first.name).to eq('name')
115
+ expect(subject.cookies.first.value).to eq('value')
116
116
  end
117
117
  end
118
118
 
119
119
  context Hash do
120
120
  it 'converts it to Cookie and update the cookie jar with it' do
121
- subject.should be_empty
121
+ expect(subject).to be_empty
122
122
 
123
123
  Arachni::Options.url = 'http://test.com'
124
124
  subject.update( name: 'value' )
125
- subject.cookies.first.name.should == 'name'
126
- subject.cookies.first.value.should == 'value'
125
+ expect(subject.cookies.first.name).to eq('name')
126
+ expect(subject.cookies.first.value).to eq('value')
127
127
  end
128
128
  end
129
129
 
130
130
  context String do
131
131
  it 'parses it into a Cookie and update the cookie jar with it' do
132
- subject.should be_empty
132
+ expect(subject).to be_empty
133
133
 
134
134
  Arachni::Options.url = 'http://test.com'
135
135
  subject.update( 'name=value' )
136
- subject.cookies.first.name.should == 'name'
137
- subject.cookies.first.value.should == 'value'
136
+ expect(subject.cookies.first.name).to eq('name')
137
+ expect(subject.cookies.first.value).to eq('value')
138
138
  end
139
139
 
140
140
  context 'when in the form of a Set-Cookie header' do
141
141
  it 'parses it into a Cookie and update the cookie jar with it' do
142
- subject.should be_empty
142
+ expect(subject).to be_empty
143
143
 
144
144
  Arachni::Options.url = 'http://test.com'
145
145
  subject.update( 'some_param=9e4ca2cc0f18a49f7c1881f78bebf7df; path=/; expires=Wed, 02-Oct-2020 23:53:46 GMT; HttpOnly' )
146
- subject.cookies.first.name.should == 'some_param'
147
- subject.cookies.first.value.should == '9e4ca2cc0f18a49f7c1881f78bebf7df'
146
+ expect(subject.cookies.first.name).to eq('some_param')
147
+ expect(subject.cookies.first.value).to eq('9e4ca2cc0f18a49f7c1881f78bebf7df')
148
148
  end
149
149
  end
150
150
 
151
151
  context 'when in the form of a Set-Cookie header' do
152
152
  it 'parses it into a Cookie and update the cookie jar with it' do
153
- subject.should be_empty
153
+ expect(subject).to be_empty
154
154
 
155
155
  Arachni::Options.url = 'http://test.com'
156
156
  subject.update( 'some_param=9e4ca2cc0f18a49f7c1881f78bebf7df; path=/; expires=Wed, 02-Oct-2020 23:53:46 GMT; HttpOnly' )
157
- subject.cookies.first.name.should == 'some_param'
158
- subject.cookies.first.value.should == '9e4ca2cc0f18a49f7c1881f78bebf7df'
157
+ expect(subject.cookies.first.name).to eq('some_param')
158
+ expect(subject.cookies.first.value).to eq('9e4ca2cc0f18a49f7c1881f78bebf7df')
159
159
  end
160
160
  end
161
161
  end
162
162
 
163
163
  context Array do
164
164
  it 'iterates and if necessary parses the entries and update the cookie jar with them' do
165
- subject.should be_empty
165
+ expect(subject).to be_empty
166
166
 
167
167
  Arachni::Options.url = 'http://test.com'
168
168
  subject.update([
@@ -174,19 +174,19 @@ describe Arachni::HTTP::CookieJar do
174
174
 
175
175
  cookies = subject.cookies
176
176
 
177
- cookies.size.should == 3
177
+ expect(cookies.size).to eq(3)
178
178
 
179
179
  c = cookies.shift
180
- c.name.should == 'cookie_name'
181
- c.value.should == 'cookie_value'
180
+ expect(c.name).to eq('cookie_name')
181
+ expect(c.value).to eq('cookie_value')
182
182
 
183
183
  c = cookies.shift
184
- c.name.should == 'hash_name'
185
- c.value.should == 'hash_value'
184
+ expect(c.name).to eq('hash_name')
185
+ expect(c.value).to eq('hash_value')
186
186
 
187
187
  c = cookies.shift
188
- c.name.should == 'string_name'
189
- c.value.should == 'string_value'
188
+ expect(c.name).to eq('string_name')
189
+ expect(c.value).to eq('string_value')
190
190
  end
191
191
  end
192
192
 
@@ -255,19 +255,19 @@ describe Arachni::HTTP::CookieJar do
255
255
 
256
256
  subject.update( cookies.values )
257
257
 
258
- subject.for_url( 'http://domain.com/my/path' ).should == [cookies[:with_path], cookies[:without_path]]
259
- subject.for_url( 'http://domain.com/my/path/' ).should == [cookies[:with_path], cookies[:without_path]]
260
- subject.for_url( 'http://domain.com' ).should == [cookies[:without_path]]
261
- subject.for_url( 'http://domain.com/' ).should == [cookies[:without_path]]
258
+ expect(subject.for_url( 'http://domain.com/my/path' )).to eq([cookies[:with_path], cookies[:without_path]])
259
+ expect(subject.for_url( 'http://domain.com/my/path/' )).to eq([cookies[:with_path], cookies[:without_path]])
260
+ expect(subject.for_url( 'http://domain.com' )).to eq([cookies[:without_path]])
261
+ expect(subject.for_url( 'http://domain.com/' )).to eq([cookies[:without_path]])
262
262
 
263
- subject.for_url( 'http://mydomain.com' ).should == [cookies[:another_domain], cookies[:tailmatching]]
264
- subject.for_url( 'http://sub.mydomain.com' ).should == [cookies[:tailmatching]]
265
- subject.for_url( 'http://deep.sub.mydomain.com' ).should == [cookies[:tailmatching]]
263
+ expect(subject.for_url( 'http://mydomain.com' )).to eq([cookies[:another_domain], cookies[:tailmatching]])
264
+ expect(subject.for_url( 'http://sub.mydomain.com' )).to eq([cookies[:tailmatching]])
265
+ expect(subject.for_url( 'http://deep.sub.mydomain.com' )).to eq([cookies[:tailmatching]])
266
266
 
267
- subject.for_url( 'http://sub.domain.com' ).should == [cookies[:subdomain], cookies[:subdomain_tailmatching]]
268
- subject.for_url( 'http://deeeep.deep.sub.domain.com' ).should == [cookies[:subdomain_tailmatching]]
267
+ expect(subject.for_url( 'http://sub.domain.com' )).to eq([cookies[:subdomain], cookies[:subdomain_tailmatching]])
268
+ expect(subject.for_url( 'http://deeeep.deep.sub.domain.com' )).to eq([cookies[:subdomain_tailmatching]])
269
269
 
270
- subject.for_url( 'http://expired.com' ).should be_empty
270
+ expect(subject.for_url( 'http://expired.com' )).to be_empty
271
271
  end
272
272
  end
273
273
 
@@ -292,21 +292,21 @@ describe Arachni::HTTP::CookieJar do
292
292
  describe 'include_expired' do
293
293
  context true do
294
294
  it 'returns all cookies' do
295
- subject.cookies( true ).size.should == 2
295
+ expect(subject.cookies( true ).size).to eq(2)
296
296
  end
297
297
  end
298
298
  context false do
299
299
  it 'returns non expired cookies only' do
300
300
  c = subject.cookies( false )
301
- c.size.should == 1
302
- c.first.name.should == 'my_name'
301
+ expect(c.size).to eq(1)
302
+ expect(c.first.name).to eq('my_name')
303
303
  end
304
304
  end
305
305
  context 'nil' do
306
306
  it 'returns non expired cookies only' do
307
307
  c = subject.cookies( false )
308
- c.size.should == 1
309
- c.first.name.should == 'my_name'
308
+ expect(c.size).to eq(1)
309
+ expect(c.first.name).to eq('my_name')
310
310
  end
311
311
  end
312
312
  end
@@ -315,23 +315,23 @@ describe Arachni::HTTP::CookieJar do
315
315
  describe '#clear' do
316
316
  it 'empties the jar' do
317
317
  subject.load( cookiejar_file )
318
- subject.empty?.should be_false
318
+ expect(subject.empty?).to be_falsey
319
319
  subject.clear
320
- subject.empty?.should be_true
320
+ expect(subject.empty?).to be_truthy
321
321
  end
322
322
  end
323
323
 
324
324
  describe '#empty?' do
325
325
  context 'when the cookie jar is empty' do
326
326
  it 'returns true' do
327
- subject.empty?.should be_true
327
+ expect(subject.empty?).to be_truthy
328
328
  end
329
329
  end
330
330
  context 'when the cookie jar is not empty' do
331
331
  it 'returns false' do
332
- subject.empty?.should be_true
332
+ expect(subject.empty?).to be_truthy
333
333
  subject.load( cookiejar_file )
334
- subject.empty?.should be_false
334
+ expect(subject.empty?).to be_falsey
335
335
  end
336
336
  end
337
337
  end
@@ -339,14 +339,14 @@ describe Arachni::HTTP::CookieJar do
339
339
  describe '#any?' do
340
340
  context 'when the cookie jar is empty' do
341
341
  it 'returns false' do
342
- subject.any?.should be_false
342
+ expect(subject.any?).to be_falsey
343
343
  end
344
344
  end
345
345
  context 'when the cookie jar is not empty' do
346
346
  it 'returns true' do
347
- subject.any?.should be_false
347
+ expect(subject.any?).to be_falsey
348
348
  subject.load( cookiejar_file )
349
- subject.any?.should be_true
349
+ expect(subject.any?).to be_truthy
350
350
  end
351
351
  end
352
352
  end
@@ -365,7 +365,7 @@ describe Arachni::HTTP::CookieJar do
365
365
  subject << c
366
366
  subject.merge! other
367
367
 
368
- subject.cookies.should == [c, other.cookies].flatten
368
+ expect(subject.cookies).to eq([c, other.cookies].flatten)
369
369
  end
370
370
  end
371
371
  end
@@ -15,14 +15,14 @@ describe Arachni::HTTP::Headers do
15
15
  end
16
16
 
17
17
  it 'merges them into an array' do
18
- subject['set-cookie'].should == cookies.values
18
+ expect(subject['set-cookie']).to eq(cookies.values)
19
19
  end
20
20
  end
21
21
 
22
22
  describe '#delete' do
23
23
  it 'deleted a header field' do
24
24
  h = described_class.new( 'x-my-field' => 'stuff' )
25
- h.delete( 'X-My-Field' ).should == 'stuff'
25
+ expect(h.delete( 'X-My-Field' )).to eq('stuff')
26
26
  end
27
27
  end
28
28
 
@@ -30,12 +30,12 @@ describe Arachni::HTTP::Headers do
30
30
  context 'when the field is included' do
31
31
  it 'returns true' do
32
32
  h = described_class.new( 'X-My-Field' => 'stuff' )
33
- h.include?( 'x-my-field' ).should be_true
33
+ expect(h.include?( 'x-my-field' )).to be_truthy
34
34
  end
35
35
  end
36
36
  context 'when the field is not included' do
37
37
  it 'returns false' do
38
- described_class.new.include?( 'x-my-field' ).should be_false
38
+ expect(described_class.new.include?( 'x-my-field' )).to be_falsey
39
39
  end
40
40
  end
41
41
  end
@@ -43,7 +43,7 @@ describe Arachni::HTTP::Headers do
43
43
  describe 'set_cookie' do
44
44
  context 'when there are no set-cookie fields' do
45
45
  it 'returns an empty array' do
46
- described_class.new.cookies.should == []
46
+ expect(described_class.new.cookies).to eq([])
47
47
  end
48
48
  end
49
49
 
@@ -53,24 +53,24 @@ describe Arachni::HTTP::Headers do
53
53
  'name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT'
54
54
  ]
55
55
 
56
- described_class.new( 'Set-Cookie' => set_coookies ).set_cookie.should == set_coookies
56
+ expect(described_class.new( 'Set-Cookie' => set_coookies ).set_cookie).to eq(set_coookies)
57
57
  end
58
58
  end
59
59
 
60
60
  describe 'cookies' do
61
61
  context 'when there are no cookies' do
62
62
  it 'returns an empty array' do
63
- described_class.new.cookies.should == []
63
+ expect(described_class.new.cookies).to eq([])
64
64
  end
65
65
  end
66
66
 
67
67
  it 'returns an array of cookies as hashes' do
68
- described_class.new(
68
+ expect(described_class.new(
69
69
  'Set-Cookie' => [
70
70
  'name=value; Expires=Wed, 09 Jun 2020 10:18:14 GMT',
71
71
  'name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT'
72
72
  ]
73
- ).cookies.should == [
73
+ ).cookies).to eq([
74
74
  {
75
75
  name: 'name',
76
76
  value: 'value',
@@ -101,7 +101,7 @@ describe Arachni::HTTP::Headers do
101
101
  domain: nil,
102
102
  httponly: false
103
103
  }
104
- ]
104
+ ])
105
105
  end
106
106
  end
107
107
 
@@ -109,10 +109,10 @@ describe Arachni::HTTP::Headers do
109
109
  it 'returns the content-type' do
110
110
  ct = 'http://test.com'
111
111
  h = { 'location' => ct }
112
- described_class.new( h ).location.should == ct
112
+ expect(described_class.new( h ).location).to eq(ct)
113
113
 
114
114
  h = { 'Location' => ct }
115
- described_class.new( h ).location.should == ct
115
+ expect(described_class.new( h ).location).to eq(ct)
116
116
  end
117
117
  end
118
118
 
@@ -120,10 +120,10 @@ describe Arachni::HTTP::Headers do
120
120
  it 'returns the content-type' do
121
121
  ct = 'text/html'
122
122
  h = { 'content-type' => ct }
123
- described_class.new( h ).content_type.should == ct
123
+ expect(described_class.new( h ).content_type).to eq(ct)
124
124
 
125
125
  h = { 'Content-Type' => ct }
126
- described_class.new( h ).content_type.should == ct
126
+ expect(described_class.new( h ).content_type).to eq(ct)
127
127
  end
128
128
  end
129
129
  end
@@ -29,7 +29,7 @@ describe Arachni::HTTP::ProxyServer do
29
29
  end
30
30
 
31
31
  def test_proxy( proxy )
32
- via_proxy( proxy, @url ).body.should == 'GET'
32
+ expect(via_proxy( proxy, @url ).body).to eq('GET')
33
33
  end
34
34
 
35
35
  it 'supports SSL interception' do
@@ -38,7 +38,7 @@ describe Arachni::HTTP::ProxyServer do
38
38
  proxy = described_class.new
39
39
  proxy.start_async
40
40
 
41
- via_proxy( proxy, url ).body.should == 'HTTPS GET'
41
+ expect(via_proxy( proxy, url ).body).to eq('HTTPS GET')
42
42
  end
43
43
 
44
44
  it 'removes any size limits on the HTTP responses' do
@@ -57,7 +57,7 @@ describe Arachni::HTTP::ProxyServer do
57
57
  proxy = described_class.new( address: address )
58
58
  proxy.start_async
59
59
 
60
- proxy.address.split( ':' ).first.should == address
60
+ expect(proxy.address.split( ':' ).first).to eq(address)
61
61
  test_proxy proxy
62
62
  end
63
63
  end
@@ -69,7 +69,7 @@ describe Arachni::HTTP::ProxyServer do
69
69
  proxy = described_class.new( port: port )
70
70
  proxy.start_async
71
71
 
72
- proxy.address.split( ':' ).last.should == port.to_s
72
+ expect(proxy.address.split( ':' ).last).to eq(port.to_s)
73
73
  test_proxy proxy
74
74
  end
75
75
  end
@@ -81,8 +81,8 @@ describe Arachni::HTTP::ProxyServer do
81
81
 
82
82
  sleep_url = @url + 'sleep'
83
83
 
84
- Typhoeus::Request.get( sleep_url ).code.should_not == 0
85
- via_proxy( proxy, sleep_url ).code.should == 0
84
+ expect(Typhoeus::Request.get( sleep_url ).code).not_to eq(0)
85
+ expect(via_proxy( proxy, sleep_url ).code).to eq(0)
86
86
  end
87
87
  end
88
88
 
@@ -98,7 +98,7 @@ describe Arachni::HTTP::ProxyServer do
98
98
  threads << Thread.new { via_proxy( proxy, sleep_url ) }
99
99
  end
100
100
  threads.each(&:join)
101
- (Time.now - time).to_i.should == 5
101
+ expect((Time.now - time).to_i).to eq(5)
102
102
 
103
103
  proxy = described_class.new( concurrency: 1 )
104
104
  proxy.start_async
@@ -108,7 +108,7 @@ describe Arachni::HTTP::ProxyServer do
108
108
  threads << Thread.new { via_proxy( proxy, sleep_url ) }
109
109
  end
110
110
  threads.each(&:join)
111
- (Time.now - time).to_i.should == 10
111
+ expect((Time.now - time).to_i).to eq(10)
112
112
  end
113
113
  end
114
114
 
@@ -117,42 +117,42 @@ describe Arachni::HTTP::ProxyServer do
117
117
  called = false
118
118
  proxy = described_class.new(
119
119
  request_handler: proc do |request, _|
120
- request.should be_kind_of Arachni::HTTP::Request
120
+ expect(request).to be_kind_of Arachni::HTTP::Request
121
121
  called = true
122
122
  end
123
123
  )
124
124
  proxy.start_async
125
125
  test_proxy proxy
126
126
 
127
- called.should be_true
127
+ expect(called).to be_truthy
128
128
  end
129
129
 
130
130
  it 'sets a block to handle each HTTP response before the request is forwarded to the origin server' do
131
131
  called = false
132
132
  proxy = described_class.new(
133
133
  request_handler: proc do |_, response|
134
- response.should be_kind_of Arachni::HTTP::Response
134
+ expect(response).to be_kind_of Arachni::HTTP::Response
135
135
  called = true
136
136
  end
137
137
  )
138
138
  proxy.start_async
139
139
  test_proxy proxy
140
140
 
141
- called.should be_true
141
+ expect(called).to be_truthy
142
142
  end
143
143
 
144
144
  it 'assigns the request to the response' do
145
145
  called = false
146
146
  proxy = described_class.new(
147
147
  request_handler: proc do |_, response|
148
- response.request.should be_kind_of Arachni::HTTP::Request
148
+ expect(response.request).to be_kind_of Arachni::HTTP::Request
149
149
  called = true
150
150
  end
151
151
  )
152
152
  proxy.start_async
153
153
  test_proxy proxy
154
154
 
155
- called.should be_true
155
+ expect(called).to be_truthy
156
156
  end
157
157
 
158
158
  it 'fills in raw request data' do
@@ -166,7 +166,7 @@ describe Arachni::HTTP::ProxyServer do
166
166
  proxy.start_async
167
167
  post_via_proxy( proxy, @url )
168
168
 
169
- request.headers_string.should ==
169
+ expect(request.headers_string).to eq(
170
170
  "POST / HTTP/1.1\r\n" <<
171
171
  "Accept-Encoding: gzip, deflate\r\n" <<
172
172
  "User-Agent: Typhoeus - https://github.com/typhoeus/typhoeus\r\n" <<
@@ -175,8 +175,9 @@ describe Arachni::HTTP::ProxyServer do
175
175
  "Proxy-Connection: Keep-Alive\r\n" <<
176
176
  "Content-Type: application/x-www-form-urlencoded\r\n" <<
177
177
  "Content-Length: 7\r\n\r\n"
178
+ )
178
179
 
179
- request.effective_body.should == '1=2&3=4'
180
+ expect(request.effective_body).to eq('1=2&3=4')
180
181
  end
181
182
 
182
183
  context 'if the block returns false' do
@@ -184,8 +185,8 @@ describe Arachni::HTTP::ProxyServer do
184
185
  called = false
185
186
  proxy = described_class.new(
186
187
  request_handler: proc do |request, response|
187
- request.should be_kind_of Arachni::HTTP::Request
188
- response.should be_kind_of Arachni::HTTP::Response
188
+ expect(request).to be_kind_of Arachni::HTTP::Request
189
+ expect(response).to be_kind_of Arachni::HTTP::Response
189
190
  called = true
190
191
 
191
192
  response.code = 200
@@ -196,9 +197,9 @@ describe Arachni::HTTP::ProxyServer do
196
197
  )
197
198
  proxy.start_async
198
199
 
199
- via_proxy( proxy, @url ).body.should == 'stuff'
200
+ expect(via_proxy( proxy, @url ).body).to eq('stuff')
200
201
 
201
- called.should be_true
202
+ expect(called).to be_truthy
202
203
  end
203
204
  end
204
205
  end
@@ -208,7 +209,7 @@ describe Arachni::HTTP::ProxyServer do
208
209
  called = false
209
210
  proxy = described_class.new(
210
211
  response_handler: proc do |request, _|
211
- request.should be_kind_of Arachni::HTTP::Request
212
+ expect(request).to be_kind_of Arachni::HTTP::Request
212
213
  called = true
213
214
  end
214
215
  )
@@ -216,14 +217,14 @@ describe Arachni::HTTP::ProxyServer do
216
217
 
217
218
  test_proxy proxy
218
219
 
219
- called.should be_true
220
+ expect(called).to be_truthy
220
221
  end
221
222
 
222
223
  it 'sets a block to handle each HTTP response once the origin server has responded' do
223
224
  called = false
224
225
  proxy = described_class.new(
225
226
  response_handler: proc do |_, response|
226
- response.should be_kind_of Arachni::HTTP::Response
227
+ expect(response).to be_kind_of Arachni::HTTP::Response
227
228
  called = true
228
229
  end
229
230
  )
@@ -231,29 +232,29 @@ describe Arachni::HTTP::ProxyServer do
231
232
 
232
233
  test_proxy proxy
233
234
 
234
- called.should be_true
235
+ expect(called).to be_truthy
235
236
  end
236
237
 
237
238
  it 'assigns the request to the response' do
238
239
  called = false
239
240
  proxy = described_class.new(
240
241
  response_handler: proc do |_, response|
241
- response.request.should be_kind_of Arachni::HTTP::Request
242
+ expect(response.request).to be_kind_of Arachni::HTTP::Request
242
243
  called = true
243
244
  end
244
245
  )
245
246
  proxy.start_async
246
247
  test_proxy proxy
247
248
 
248
- called.should be_true
249
+ expect(called).to be_truthy
249
250
  end
250
251
 
251
252
  it 'can manipulate the response' do
252
253
  called = false
253
254
  proxy = described_class.new(
254
255
  response_handler: proc do |request, response|
255
- request.should be_kind_of Arachni::HTTP::Request
256
- response.should be_kind_of Arachni::HTTP::Response
256
+ expect(request).to be_kind_of Arachni::HTTP::Request
257
+ expect(response).to be_kind_of Arachni::HTTP::Response
257
258
  called = true
258
259
 
259
260
  response.body = 'stuff'
@@ -263,10 +264,10 @@ describe Arachni::HTTP::ProxyServer do
263
264
 
264
265
  response = via_proxy( proxy, @url )
265
266
 
266
- response.code.should == 200
267
- response.body.should == 'stuff'
267
+ expect(response.code).to eq(200)
268
+ expect(response.body).to eq('stuff')
268
269
 
269
- called.should be_true
270
+ expect(called).to be_truthy
270
271
  end
271
272
  end
272
273
  end
@@ -283,7 +284,7 @@ describe Arachni::HTTP::ProxyServer do
283
284
  context 'when the server is not running' do
284
285
  it 'returns false' do
285
286
  proxy = described_class.new
286
- proxy.running?.should be_false
287
+ expect(proxy.running?).to be_falsey
287
288
  end
288
289
  end
289
290
 
@@ -291,7 +292,7 @@ describe Arachni::HTTP::ProxyServer do
291
292
  it 'returns true' do
292
293
  proxy = described_class.new
293
294
  proxy.start_async
294
- proxy.running?.should be_true
295
+ expect(proxy.running?).to be_truthy
295
296
  end
296
297
  end
297
298
  end
@@ -302,7 +303,7 @@ describe Arachni::HTTP::ProxyServer do
302
303
  port = Arachni::Utilities.available_port
303
304
 
304
305
  proxy = described_class.new( address: address, port: port )
305
- proxy.address.should == "#{address}:#{port}"
306
+ expect(proxy.address).to eq("#{address}:#{port}")
306
307
  proxy.start_async
307
308
  test_proxy proxy
308
309
  end
@@ -314,10 +315,10 @@ describe Arachni::HTTP::ProxyServer do
314
315
  proxy = described_class.new
315
316
  proxy.start_async
316
317
 
317
- proxy.has_connections?.should be_false
318
+ expect(proxy.has_connections?).to be_falsey
318
319
  Thread.new { via_proxy( proxy, @url + 'sleep' ) }
319
320
  sleep 1
320
- proxy.has_connections?.should be_true
321
+ expect(proxy.has_connections?).to be_truthy
321
322
  end
322
323
  end
323
324
 
@@ -326,9 +327,9 @@ describe Arachni::HTTP::ProxyServer do
326
327
  proxy = described_class.new
327
328
  proxy.start_async
328
329
 
329
- proxy.has_connections?.should be_false
330
+ expect(proxy.has_connections?).to be_falsey
330
331
  via_proxy( proxy, @url + 'sleep' )
331
- proxy.has_connections?.should be_false
332
+ expect(proxy.has_connections?).to be_falsey
332
333
  end
333
334
  end
334
335
  end
@@ -339,12 +340,12 @@ describe Arachni::HTTP::ProxyServer do
339
340
  proxy = described_class.new
340
341
  proxy.start_async
341
342
 
342
- proxy.active_connections.should == 0
343
+ expect(proxy.active_connections).to eq(0)
343
344
  3.times do
344
345
  Thread.new { via_proxy( proxy, @url + 'sleep' ) }
345
346
  end
346
347
  sleep 1
347
- proxy.active_connections.should == 3
348
+ expect(proxy.active_connections).to eq(3)
348
349
  end
349
350
  end
350
351
 
@@ -353,9 +354,9 @@ describe Arachni::HTTP::ProxyServer do
353
354
  proxy = described_class.new
354
355
  proxy.start_async
355
356
 
356
- proxy.active_connections.should == 0
357
+ expect(proxy.active_connections).to eq(0)
357
358
  via_proxy( proxy, @url + 'sleep' )
358
- proxy.active_connections.should == 0
359
+ expect(proxy.active_connections).to eq(0)
359
360
  end
360
361
  end
361
362
  end