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
@@ -1,12 +1,26 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Arachni::Element::LinkTemplate::DOM do
4
+ inputs = { 'param' => 'some-name' }
5
+
4
6
  it_should_behave_like 'element_dom'
5
7
 
8
+ it_should_behave_like 'with_node'
9
+ it_should_behave_like 'with_auditor'
10
+
11
+ it_should_behave_like 'submittable_dom'
12
+ it_should_behave_like 'inputtable_dom', inputs: inputs
13
+ it_should_behave_like 'mutable_dom', inputs: inputs
14
+ it_should_behave_like 'auditable_dom'
15
+
6
16
  def auditable_extract_parameters( page )
7
17
  { 'param' => page.document.css('#container').text }
8
18
  end
9
19
 
20
+ def run
21
+ auditor.browser_cluster.wait
22
+ end
23
+
10
24
  before :each do
11
25
  @framework = Arachni::Framework.new
12
26
  @page = Arachni::Page.from_url( url )
@@ -38,43 +52,43 @@ describe Arachni::Element::LinkTemplate::DOM do
38
52
  end
39
53
 
40
54
  let(:mutable) do
41
- inputtable.dup
55
+ subject.dup
42
56
  end
43
57
 
44
58
  describe '#type' do
45
59
  it 'returns :link_dom' do
46
- subject.type.should == :link_template_dom
60
+ expect(subject.type).to eq(:link_template_dom)
47
61
  end
48
62
  end
49
63
 
50
64
  describe '.type' do
51
65
  it 'returns :link_dom' do
52
- described_class.type.should == :link_template_dom
66
+ expect(described_class.type).to eq(:link_template_dom)
53
67
  end
54
68
  end
55
69
 
56
70
  describe '#extract_inputs' do
57
71
  it "delegates to #{Arachni::Element::LinkTemplate}.extract_inputs" do
58
- Arachni::Element::LinkTemplate.stub(:extract_inputs) { |arg| "#{arg}1" }
59
- subject.extract_inputs( 'blah' ).should == 'blah1'
72
+ allow(Arachni::Element::LinkTemplate).to receive(:extract_inputs) { |arg| "#{arg}1" }
73
+ expect(subject.extract_inputs( 'blah' )).to eq('blah1')
60
74
  end
61
75
  end
62
76
 
63
77
  describe '#parent' do
64
78
  it 'returns the parent element' do
65
- subject.parent.should be_kind_of Arachni::Element::LinkTemplate
79
+ expect(subject.parent).to be_kind_of Arachni::Element::LinkTemplate
66
80
  end
67
81
  end
68
82
 
69
83
  describe '#inputs' do
70
84
  it 'parses query-style inputs from URL fragments' do
71
- subject.inputs.should == { 'param' => 'some-name' }
85
+ expect(subject.inputs).to eq({ 'param' => 'some-name' })
72
86
  end
73
87
  end
74
88
 
75
89
  describe '#fragment' do
76
90
  it 'returns the URL fragment' do
77
- subject.fragment.should == '/param/some-name'
91
+ expect(subject.fragment).to eq('/param/some-name')
78
92
  end
79
93
  end
80
94
 
@@ -86,17 +100,17 @@ describe Arachni::Element::LinkTemplate::DOM do
86
100
  browser.load subject.page
87
101
 
88
102
  element = subject.locate
89
- element.should be_kind_of Watir::HTMLElement
103
+ expect(element).to be_kind_of Watir::HTMLElement
90
104
 
91
- parent.class.from_document(
105
+ expect(parent.class.from_document(
92
106
  parent.url, Nokogiri::HTML(element.html)
93
- ).first.should == parent
107
+ ).first).to eq(parent)
94
108
 
95
109
  called = true
96
110
  end
97
111
 
98
112
  subject.auditor.browser_cluster.wait
99
- called.should be_true
113
+ expect(called).to be_truthy
100
114
  end
101
115
  end
102
116
 
@@ -111,53 +125,57 @@ describe Arachni::Element::LinkTemplate::DOM do
111
125
 
112
126
  subject.trigger
113
127
 
114
- subject.inputs.should == auditable_extract_parameters( browser.to_page )
128
+ expect(subject.inputs).to eq(auditable_extract_parameters( browser.to_page ))
115
129
  called = true
116
130
  end
117
131
 
118
132
  subject.auditor.browser_cluster.wait
119
- called.should be_true
133
+ expect(called).to be_truthy
120
134
  end
121
135
 
122
136
  it 'returns a playable transition' do
123
137
  inputs = { 'param' => 'The.Dude' }
124
138
  subject.update inputs
125
139
 
126
- transition = nil
140
+ transitions = []
127
141
  called = false
128
142
  subject.with_browser do |browser|
129
143
  subject.browser = browser
130
144
  browser.load subject.page
131
145
 
132
- transition = subject.trigger
146
+ transitions = subject.trigger
133
147
 
134
148
  page = browser.to_page
135
149
 
136
- subject.inputs.should == auditable_extract_parameters( page )
150
+ expect(subject.inputs).to eq(auditable_extract_parameters( page ))
137
151
  called = true
138
152
  end
139
153
 
140
154
  subject.auditor.browser_cluster.wait
141
- called.should be_true
155
+ expect(called).to be_truthy
142
156
 
143
157
  called = false
144
158
  auditor.with_browser do |browser|
145
159
  browser.load subject.page
146
- auditable_extract_parameters( browser.to_page ).should ==
160
+ expect(auditable_extract_parameters( browser.to_page )).to eq(
147
161
  { 'param' => '' }
162
+ )
163
+
164
+ transitions.each do |transition|
165
+ transition.play browser
166
+ end
148
167
 
149
- transition.play browser
150
- auditable_extract_parameters( browser.to_page ).should == inputs
168
+ expect(auditable_extract_parameters( browser.to_page )).to eq(inputs)
151
169
  called = true
152
170
  end
153
171
  auditor.browser_cluster.wait
154
- called.should be_true
172
+ expect(called).to be_truthy
155
173
  end
156
174
  end
157
175
 
158
176
  describe '.to_rpc_data' do
159
177
  it 'converts the #template to a string' do
160
- subject.to_rpc_data['template'].should == subject.template.source
178
+ expect(subject.to_rpc_data['template']).to eq(subject.template.source)
161
179
  end
162
180
  end
163
181
 
@@ -166,22 +184,22 @@ describe Arachni::Element::LinkTemplate::DOM do
166
184
  let(:data) { described_class.data_from_node( node ) }
167
185
 
168
186
  it 'returns a hash with DOM data' do
169
- data.should == {
187
+ expect(data).to eq({
170
188
  inputs: {
171
189
  'param' => 'some-name'
172
190
  },
173
191
  template: /param\/(?<param>.+)/,
174
192
  fragment: '/param/some-name'
175
- }
193
+ })
176
194
  end
177
195
 
178
196
  it 'decodes the fragment before extracting inputs' do
179
197
  html = "<a href='#/param/bl%20ah'>Stuff</a>"
180
198
  node = Nokogiri::HTML.fragment(html).children.first
181
199
 
182
- described_class.data_from_node( node )[:inputs].should == {
200
+ expect(described_class.data_from_node( node )[:inputs]).to eq({
183
201
  'param' => 'bl ah'
184
- }
202
+ })
185
203
  end
186
204
 
187
205
  context 'when there is no URL fragment' do
@@ -191,7 +209,7 @@ describe Arachni::Element::LinkTemplate::DOM do
191
209
  end
192
210
 
193
211
  it 'return nil' do
194
- described_class.data_from_node( node ).should be_nil
212
+ expect(described_class.data_from_node( node )).to be_nil
195
213
  end
196
214
  end
197
215
 
@@ -202,7 +220,7 @@ describe Arachni::Element::LinkTemplate::DOM do
202
220
  end
203
221
 
204
222
  it 'return nil' do
205
- described_class.data_from_node( node ).should be_nil
223
+ expect(described_class.data_from_node( node )).to be_nil
206
224
  end
207
225
  end
208
226
  end
@@ -4,10 +4,27 @@ describe Arachni::Element::LinkTemplate do
4
4
  html = "<a href='http://test.com/#/param/val'>stuff</a>"
5
5
 
6
6
  it_should_behave_like 'element'
7
- it_should_behave_like 'with_node', html
7
+ it_should_behave_like 'with_node'
8
8
  it_should_behave_like 'with_dom', html
9
+ it_should_behave_like 'with_source'
10
+ it_should_behave_like 'with_auditor'
11
+
12
+ it_should_behave_like 'submittable'
13
+ it_should_behave_like 'inputtable'
14
+ it_should_behave_like 'mutable'
9
15
  it_should_behave_like 'auditable'
10
16
 
17
+ before :each do
18
+ @framework ||= Arachni::Framework.new
19
+ @auditor = Auditor.new( Arachni::Page.from_url( url ), @framework )
20
+ end
21
+
22
+ after :each do
23
+ @framework.reset
24
+ end
25
+
26
+ let(:auditor) { @auditor }
27
+
11
28
  before :each do
12
29
  Arachni::Options.audit.link_templates = /param\/(?<param>\w+)/
13
30
  end
@@ -27,7 +44,8 @@ describe Arachni::Element::LinkTemplate do
27
44
  subject do
28
45
  described_class.new(
29
46
  url: url_with_inputs,
30
- template: template
47
+ template: template,
48
+ source: html
31
49
  )
32
50
  end
33
51
  let(:inputtable) do
@@ -48,29 +66,29 @@ describe Arachni::Element::LinkTemplate do
48
66
  describe :options do
49
67
  describe :template do
50
68
  it 'sets the #template' do
51
- described_class.new(
69
+ expect(described_class.new(
52
70
  url: url_with_inputs,
53
71
  template: template
54
- ).template.should == template
72
+ ).template).to eq(template)
55
73
  end
56
74
  end
57
75
 
58
76
  describe :inputs do
59
77
  it 'sets the #inputs' do
60
- described_class.new(
78
+ expect(described_class.new(
61
79
  url: url_with_inputs,
62
80
  inputs: inputs,
63
81
  template: template
64
- ).inputs.should == inputs
82
+ ).inputs).to eq(inputs)
65
83
  end
66
84
  end
67
85
 
68
86
  context 'when no :inputs are provided' do
69
87
  it 'uses the given :template to extract them' do
70
- described_class.new(
88
+ expect(described_class.new(
71
89
  url: url_with_inputs,
72
90
  template: template
73
- ).inputs.should == inputs
91
+ ).inputs).to eq(inputs)
74
92
  end
75
93
 
76
94
  context 'when no :template is provided' do
@@ -78,8 +96,8 @@ describe Arachni::Element::LinkTemplate do
78
96
  Arachni::Options.audit.link_templates = template
79
97
 
80
98
  l = described_class.new( url: url_with_inputs )
81
- l.inputs.should == inputs
82
- l.template.should == template
99
+ expect(l.inputs).to eq(inputs)
100
+ expect(l.template).to eq(template)
83
101
  end
84
102
  end
85
103
  end
@@ -88,39 +106,39 @@ describe Arachni::Element::LinkTemplate do
88
106
 
89
107
  describe '#simple' do
90
108
  it 'returns a simple hash representation' do
91
- subject.simple.should == {
109
+ expect(subject.simple).to eq({
92
110
  subject.action => subject.inputs
93
- }
111
+ })
94
112
  end
95
113
  end
96
114
 
97
115
  describe '#valid_input_name?' do
98
116
  context 'when the name can be found in the #template named captures' do
99
117
  it 'returns true' do
100
- subject.template.names.should be_any
118
+ expect(subject.template.names).to be_any
101
119
 
102
120
  subject.template.names.each do |name|
103
- subject.valid_input_name?( name ).should be_true
121
+ expect(subject.valid_input_name?( name )).to be_truthy
104
122
  end
105
123
  end
106
124
  end
107
125
 
108
126
  context 'when the name cannot be found in the #template named captures' do
109
127
  it 'returns false' do
110
- subject.valid_input_name?( 'stuff' ).should be_false
128
+ expect(subject.valid_input_name?( 'stuff' )).to be_falsey
111
129
  end
112
130
  end
113
131
  end
114
132
 
115
133
  describe '#valid_input_data?' do
116
134
  it 'returns true' do
117
- subject.valid_input_data?( 'stuff' ).should be_true
135
+ expect(subject.valid_input_data?( 'stuff' )).to be_truthy
118
136
  end
119
137
 
120
138
  described_class::INVALID_INPUT_DATA.each do |invalid_data|
121
139
  context "when the value contains #{invalid_data.inspect}" do
122
140
  it 'returns false' do
123
- subject.valid_input_data?( "stuff #{invalid_data}" ).should be_false
141
+ expect(subject.valid_input_data?( "stuff #{invalid_data}" )).to be_falsey
124
142
  end
125
143
  end
126
144
  end
@@ -130,28 +148,28 @@ describe Arachni::Element::LinkTemplate do
130
148
  context 'when there are no DOM#inputs' do
131
149
  it 'returns nil' do
132
150
  subject.source = '<a href="/stuff">Bla</a>'
133
- subject.dom.should be_nil
151
+ expect(subject.dom).to be_nil
134
152
  end
135
153
  end
136
154
 
137
155
  context 'when there is no #node' do
138
156
  it 'returns nil' do
139
157
  subject.source = nil
140
- subject.dom.should be_nil
158
+ expect(subject.dom).to be_nil
141
159
  end
142
160
  end
143
161
  end
144
162
 
145
163
  describe '#to_s' do
146
164
  it 'returns the updated link' do
147
- inputtable.to_s.should == inputtable.action
165
+ expect(inputtable.to_s).to eq(inputtable.action)
148
166
 
149
167
  inputtable.inputs = {
150
168
  'input1' => 'new value 1',
151
169
  'input2' => 'new value 2'
152
170
  }
153
171
 
154
- inputtable.to_s.should == "#{url}input1/new%20value%201/input2/new%20value%202"
172
+ expect(inputtable.to_s).to eq("#{url}input1/new%20value%201/input2/new%20value%202")
155
173
  end
156
174
  end
157
175
 
@@ -163,7 +181,7 @@ describe Arachni::Element::LinkTemplate do
163
181
  c = subject.dup
164
182
  c.source ="<a href='http://test.com/#/param/val2'>stuff</a>"
165
183
 
166
- c.coverage_id.should == e.coverage_id
184
+ expect(c.coverage_id).to eq(e.coverage_id)
167
185
 
168
186
  e = subject.dup
169
187
  e.source ="<a href='http://test.com/#/param/val'>stuff</a>"
@@ -173,7 +191,7 @@ describe Arachni::Element::LinkTemplate do
173
191
  c = subject.dup
174
192
  c.source ="<a href='http://test.com/#/param2/val'>stuff</a>"
175
193
 
176
- c.coverage_id.should_not == e.coverage_id
194
+ expect(c.coverage_id).not_to eq(e.coverage_id)
177
195
  end
178
196
  end
179
197
 
@@ -185,7 +203,7 @@ describe Arachni::Element::LinkTemplate do
185
203
  c = subject.dup
186
204
  c.source ="<a href='http://test.com/#/param/val'>stuff</a>"
187
205
 
188
- c.id.should == e.id
206
+ expect(c.id).to eq(e.id)
189
207
 
190
208
  e = subject.dup
191
209
  e.source ="<a href='http://test.com/#/param/val'>stuff</a>"
@@ -193,7 +211,7 @@ describe Arachni::Element::LinkTemplate do
193
211
  c = subject.dup
194
212
  c.source ="<a href='http://test.com/#/param/val1'>stuff</a>"
195
213
 
196
- c.id.should_not == e.id
214
+ expect(c.id).not_to eq(e.id)
197
215
 
198
216
  e = subject.dup
199
217
  e.source ="<a href='http://test.com/#/param/val'>stuff</a>"
@@ -201,35 +219,35 @@ describe Arachni::Element::LinkTemplate do
201
219
  c = subject.dup
202
220
  c.source ="<a href='http://test.com/#/param2/val'>stuff</a>"
203
221
 
204
- c.id.should_not == e.id
222
+ expect(c.id).not_to eq(e.id)
205
223
  end
206
224
  end
207
225
 
208
226
  describe '#to_rpc_data' do
209
227
  it "does not include 'dom_data'" do
210
228
  subject.source = html
211
- subject.dom.should be_true
229
+ expect(subject.dom).to be_truthy
212
230
 
213
- subject.to_rpc_data.should_not include 'dom_data'
231
+ expect(subject.to_rpc_data).not_to include 'dom_data'
214
232
  end
215
233
  end
216
234
 
217
235
  describe '.encode' do
218
236
  it 'URL-encodes the passed string' do
219
- described_class.encode( 'test/;' ).should == 'test%2F%3B'
237
+ expect(described_class.encode( 'test/;' )).to eq('test%2F%3B')
220
238
  end
221
239
  end
222
240
 
223
241
  describe '.decode' do
224
242
  it 'URL-decodes the passed string' do
225
243
  v = '%25+value%5C+%2B%3D%26%3B'
226
- described_class.decode( v ).should == URI.decode( v )
244
+ expect(described_class.decode( v )).to eq(URI.decode( v ))
227
245
  end
228
246
  end
229
247
  describe '#decode' do
230
248
  it 'URL-decodes the passed string' do
231
249
  v = '%25+value%5C+%2B%3D%26%3B'
232
- subject.decode( v ).should == described_class.decode( v )
250
+ expect(subject.decode( v )).to eq(described_class.decode( v ))
233
251
  end
234
252
  end
235
253
 
@@ -239,11 +257,11 @@ describe Arachni::Element::LinkTemplate do
239
257
  templates = [/input1\/(?<input1>\w+)\/input2\/(?<input2>\w+)/]
240
258
 
241
259
  template, inputs = described_class.extract_inputs( url, templates )
242
- templates.should == [template]
243
- inputs.should == {
260
+ expect(templates).to eq([template])
261
+ expect(inputs).to eq({
244
262
  'input1' => 'value1',
245
263
  'input2' => 'value2'
246
- }
264
+ })
247
265
  end
248
266
 
249
267
  it 'decodes the input values' do
@@ -251,15 +269,15 @@ describe Arachni::Element::LinkTemplate do
251
269
  templates = [/input1\/(?<input1>.+)\/input2\/(?<input2>.+)/]
252
270
 
253
271
  _, inputs = described_class.extract_inputs( url, templates )
254
- inputs.should == {
272
+ expect(inputs).to eq({
255
273
  'input1' => 'val ue1',
256
274
  'input2' => 'val ue2'
257
- }
275
+ })
258
276
  end
259
277
 
260
278
  context 'when no URL is given' do
261
279
  it 'returns an empty array' do
262
- described_class.extract_inputs( nil ).should == []
280
+ expect(described_class.extract_inputs( nil )).to eq([])
263
281
  end
264
282
  end
265
283
 
@@ -271,12 +289,12 @@ describe Arachni::Element::LinkTemplate do
271
289
  Arachni::Options.audit.link_templates = templates
272
290
 
273
291
  template, inputs = described_class.extract_inputs( url )
274
- inputs.should == {
292
+ expect(inputs).to eq({
275
293
  'input1' => 'value1',
276
294
  'input2' => 'value2'
277
- }
295
+ })
278
296
 
279
- [templates].should == [Arachni::Options.audit.link_templates]
297
+ expect([templates]).to eq([Arachni::Options.audit.link_templates])
280
298
  end
281
299
  end
282
300
 
@@ -285,14 +303,14 @@ describe Arachni::Element::LinkTemplate do
285
303
  url = "#{url}input3/value1/input4/value2"
286
304
  templates = [/input1\/(?<input1>\w+)\/input2\/(?<input2>\w+)/]
287
305
 
288
- described_class.extract_inputs( url, templates ).should == []
306
+ expect(described_class.extract_inputs( url, templates )).to eq([])
289
307
  end
290
308
  end
291
309
  end
292
310
 
293
311
  describe '.type' do
294
312
  it 'returns :link_template' do
295
- described_class.type.should == :link_template
313
+ expect(described_class.type).to eq(:link_template)
296
314
  end
297
315
  end
298
316
 
@@ -309,11 +327,11 @@ describe Arachni::Element::LinkTemplate do
309
327
  )
310
328
 
311
329
  link = described_class.from_response( response ).first
312
- link.action.should == url + 'test2/param/myvalue'
313
- link.url.should == url
314
- link.inputs.should == {
330
+ expect(link.action).to eq(url + 'test2/param/myvalue')
331
+ expect(link.url).to eq(url)
332
+ expect(link.inputs).to eq({
315
333
  'param' => 'myvalue'
316
- }
334
+ })
317
335
  end
318
336
 
319
337
  context 'when the URL matches a link template' do
@@ -323,11 +341,11 @@ describe Arachni::Element::LinkTemplate do
323
341
  )
324
342
 
325
343
  link = described_class.from_response( response ).first
326
- link.action.should == url + 'test2/param/myvalue'
327
- link.url.should == link.action
328
- link.inputs.should == {
344
+ expect(link.action).to eq(url + 'test2/param/myvalue')
345
+ expect(link.url).to eq(link.action)
346
+ expect(link.inputs).to eq({
329
347
  'param' => 'myvalue'
330
- }
348
+ })
331
349
  end
332
350
  end
333
351
  end
@@ -335,7 +353,7 @@ describe Arachni::Element::LinkTemplate do
335
353
  describe '.from_document' do
336
354
  context 'when the response does not contain any link templates' do
337
355
  it 'returns an empty array' do
338
- described_class.from_document( '', '' ).should be_empty
356
+ expect(described_class.from_document( '', '' )).to be_empty
339
357
  end
340
358
  end
341
359
  context 'when links have actions that are out of scope' do
@@ -352,8 +370,8 @@ describe Arachni::Element::LinkTemplate do
352
370
  Arachni::Options.scope.exclude_path_patterns = [/exclude/]
353
371
 
354
372
  links = described_class.from_document( url, html )
355
- links.size.should == 1
356
- links.first.action.should == url + 'test2/param/myvalue'
373
+ expect(links.size).to eq(1)
374
+ expect(links.first.action).to eq(url + 'test2/param/myvalue')
357
375
  end
358
376
  end
359
377
  context 'when the response contains link templates' do
@@ -366,11 +384,11 @@ describe Arachni::Element::LinkTemplate do
366
384
  </html>'
367
385
 
368
386
  link = described_class.from_document( url, html ).first
369
- link.action.should == url + 'test2/param/myvalue'
370
- link.url.should == url
371
- link.inputs.should == {
387
+ expect(link.action).to eq(url + 'test2/param/myvalue')
388
+ expect(link.url).to eq(url)
389
+ expect(link.inputs).to eq({
372
390
  'param' => 'myvalue'
373
- }
391
+ })
374
392
  end
375
393
 
376
394
  context 'and includes a base attribute' do
@@ -387,11 +405,11 @@ describe Arachni::Element::LinkTemplate do
387
405
  </html>'
388
406
 
389
407
  link = described_class.from_document( url, html ).first
390
- link.action.should == base_url + 'test/param/myvalue'
391
- link.url.should == url
392
- link.inputs.should == {
408
+ expect(link.action).to eq(base_url + 'test/param/myvalue')
409
+ expect(link.url).to eq(url)
410
+ expect(link.inputs).to eq({
393
411
  'param' => 'myvalue'
394
- }
412
+ })
395
413
  end
396
414
  end
397
415
  end