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,336 +1,340 @@
1
- require 'spec_helper'
2
-
3
- describe 'Arachni::RPC::Server::Framework' do
4
- before( :all ) do
5
- @opts = Arachni::Options.instance
6
- @opts.paths.checks = fixtures_path + '/taint_check/'
7
- @opts.audit.elements :links, :forms, :cookies
8
-
9
- @instance = instance_light_grid_spawn
10
- @framework = @instance.framework
11
- @checks = @instance.checks
12
- @plugins = @instance.plugins
13
-
14
- @instance_clean = instance_light_grid_spawn
15
- @framework_clean = @instance_clean.framework
16
-
17
- @statistics_keys = [:http, :found_pages, :audited_pages, :runtime]
18
- end
19
-
20
- describe '#errors' do
21
- context 'when no argument has been provided' do
22
- it 'returns all logged errors' do
23
- test = 'Test'
24
- @framework.error_test test
25
- @framework.errors.last.should end_with test
26
- end
27
- end
28
- context 'when a start line-range has been provided' do
29
- it 'returns all logged errors after that line' do
30
- initial_errors = @framework.errors
31
- errors = @framework.errors( 10 )
32
-
33
- initial_errors[10..-1].should == errors
34
- end
35
- end
36
- end
37
-
38
- describe '#busy?' do
39
- context 'when the scan is not running' do
40
- it 'returns false' do
41
- @framework_clean.busy?.should be_false
42
- end
43
- end
44
- context 'when the scan is running' do
45
- it 'returns true' do
46
- @instance.options.url = web_server_url_for( :auditor )
47
- @checks.load( 'taint' )
48
- @framework.run.should be_true
49
- @framework.busy?.should be_true
50
- end
51
- end
52
- end
53
- describe '#version' do
54
- it 'returns the system version' do
55
- @framework_clean.version.should == Arachni::VERSION
56
- end
57
- end
58
- describe '#master?' do
59
- it 'returns false' do
60
- @framework_clean.master?.should be_true
61
- end
62
- end
63
- describe '#slave?' do
64
- it 'returns false' do
65
- @framework_clean.slave?.should be_false
66
- end
67
- end
68
- describe '#solo?' do
69
- it 'returns true' do
70
- @framework_clean.solo?.should be_false
71
- end
72
- end
73
- describe '#set_as_master' do
74
- it 'sets the instance as the master' do
75
- instance = instance_spawn
76
- instance.framework.master?.should be_false
77
- instance.framework.set_as_master
78
- instance.framework.master?.should be_true
79
-
80
- instance_kill instance.url
81
- end
82
- end
83
- describe '#enslave' do
84
- it 'enslaves another instance and set itself as its master' do
85
- master = instance_spawn
86
- slave = instance_spawn
87
-
88
- master.framework.master?.should be_false
89
- master.framework.enslave(
90
- 'url' => slave.url,
91
- 'token' => instance_token_for( slave )
92
- )
93
- master.framework.master?.should be_true
94
-
95
- instance_kill master.url
96
- end
97
- end
98
- describe '#run' do
99
- it 'performs a scan' do
100
- instance = @instance_clean
101
- instance.options.url = web_server_url_for( :framework_multi )
102
- instance.checks.load( 'taint' )
103
- instance.framework.run.should be_true
104
- sleep( 1 ) while instance.framework.busy?
105
- instance.framework.issues.size.should == 500
106
- end
107
-
108
- it 'handles pages with JavaScript code' do
109
- instance = instance_light_grid_spawn
110
- instance.options.url = web_server_url_for( :auditor ) + '/with_javascript'
111
- instance.checks.load :taint
112
-
113
- instance.framework.run.should be_true
114
- sleep 0.1 while instance.framework.busy?
115
-
116
- instance.framework.issues.
117
- map { |i| i.vector.affected_input_name }.uniq.should be
118
- %w(link_input form_input cookie_input)
119
-
120
- # dispatcher_kill_by_instance instance
121
- end
122
-
123
- it 'handles AJAX' do
124
- instance = instance_light_grid_spawn
125
- instance.options.url = web_server_url_for( :auditor ) + '/with_ajax'
126
- instance.checks.load :taint
127
-
128
- instance.framework.run.should be_true
129
- sleep 0.1 while instance.framework.busy?
130
-
131
- instance.framework.issues.
132
- map { |i| i.vector.affected_input_name }.uniq.should be
133
- %w(link_input form_input cookie_taint).sort
134
-
135
- # dispatcher_kill_by_instance instance
136
- end
137
- end
138
- describe '#report' do
139
- it 'returns an report object' do
140
- report = @instance_clean.framework.report
141
- report.is_a?( Arachni::Report ).should be_true
142
- report.issues.should be_any
143
- end
144
- end
145
- describe '#statistics' do
146
- it 'returns a hash containing general runtime statistics' do
147
- statistics = @instance_clean.framework.statistics
148
-
149
- keys = @statistics_keys | [:current_page]
150
-
151
- statistics.keys.sort.should == keys.sort
152
- keys.each { |k| statistics[k].should be_true }
153
- end
154
- end
155
- describe '#clean_up' do
156
- it 'sets the framework state to finished, waits for plugins to finish and merges their results' do
157
- @instance = instance = instance_light_grid_spawn
158
- instance.options.url = web_server_url_for( :framework_multi )
159
- instance.checks.load( 'taint' )
160
- instance.plugins.load( { 'wait' => {}, 'distributable' => {} } )
161
- instance.framework.run.should be_true
162
- instance.framework.report.plugins.should be_empty
163
-
164
- # Wait till the slaves join the scan.
165
- sleep 0.1 while instance.framework.progress[:instances].size != 3
166
-
167
- instance.framework.clean_up.should be_true
168
-
169
- instance_count = instance.framework.progress[:instances].size
170
- report = instance.framework.report
171
-
172
- results = report.plugins
173
- results.should be_any
174
- results[:wait].should be_any
175
- results[:wait][:results].should == { 'stuff' => true }
176
- results[:distributable][:results].should == { 'stuff' => instance_count }
177
-
178
- # dispatcher_kill_by_instance instance
179
- end
180
- end
181
- describe '#progress' do
182
- before { @progress_keys = %W(statistics status busy issues instances).map(&:to_sym).sort }
183
-
184
- context 'when called without options' do
185
- it 'returns all progress data' do
186
- instance = @instance_clean
187
-
188
- data = instance.framework.progress
189
-
190
- data.keys.sort.should == (@progress_keys | [:master]).flatten.sort
191
-
192
- data[:statistics].keys.sort.should ==
193
- (@statistics_keys | [:current_pages]).flatten.sort
194
-
195
- data[:status].should be_kind_of Symbol
196
- data[:master].should == instance.url
197
- data[:busy].should_not be_nil
198
- data[:issues].should be_any
199
- data[:instances].size.should == 3
200
-
201
- data.should_not include :errors
202
-
203
- keys = (@statistics_keys | [:current_page]).flatten.sort
204
-
205
- data[:instances].each do |i|
206
- i[:statistics].keys.sort.should == keys
207
- i.keys.sort.should == [:url, :statistics, :status, :busy, :messages].sort
208
- end
209
-
210
- data.delete :issues
211
- end
212
- end
213
-
214
- context 'when called with option' do
215
- describe :errors do
216
- context 'when set to true' do
217
- it 'includes all error messages' do
218
- instance = instance_light_grid_spawn
219
- instance.framework.progress( errors: true )[:errors].should be_empty
220
-
221
- test = 'Test'
222
- instance.framework.error_test test
223
-
224
- instance.framework.progress( errors: true )[:errors].last.should end_with test
225
-
226
- # dispatcher_kill_by_instance instance
227
- end
228
- end
229
- context 'when set to an Integer' do
230
- it 'returns all logged errors after that line per Instance' do
231
- instance = instance_light_grid_spawn
232
-
233
- 100.times { instance.framework.error_test 'test' }
234
-
235
- (instance.framework.progress( errors: true )[:errors].size -
236
- instance.framework.progress( errors: 10 )[:errors].size).should == 10
237
-
238
- # dispatcher_kill_by_instance instance
239
- end
240
- end
241
- end
242
-
243
- describe :sitemap do
244
- context 'when set to true' do
245
- it 'returns entire sitemap' do
246
- @instance_clean.framework.
247
- progress( sitemap: true )[:sitemap].should ==
248
- @instance_clean.framework.sitemap
249
- end
250
- end
251
-
252
- context 'when an index has been provided' do
253
- it 'returns all entries after that line' do
254
- @instance_clean.framework.progress( sitemap: 10 )[:sitemap].should ==
255
- @instance_clean.framework.sitemap_entries( 10 )
256
- end
257
- end
258
- end
259
-
260
- describe :statistics do
261
- context 'when set to false' do
262
- it 'excludes statistics' do
263
- @instance_clean.framework.progress(
264
- statistics: false
265
- ).should_not include :statistics
266
- end
267
- end
268
- end
269
- describe :issues do
270
- context 'when set to false' do
271
- it 'excludes issues' do
272
- @instance_clean.framework.progress(
273
- issues: false
274
- ).should_not include :issues
275
- end
276
- end
277
- end
278
- describe :slaves do
279
- context 'when set to false' do
280
- it 'excludes slave data' do
281
- @instance_clean.framework.progress(
282
- slaves: false
283
- ).should_not include :instances
284
- end
285
- end
286
- end
287
- describe :as_hash do
288
- context 'when set to true' do
289
- it 'includes issues as a hash' do
290
- @instance_clean.framework.
291
- progress( as_hash: true )[:issues].
292
- first.is_a?( Hash ).should be_true
293
- end
294
- end
295
- end
296
- end
297
- end
298
-
299
- describe '#sitemap_entries' do
300
- context 'when no argument has been provided' do
301
- it 'returns entire sitemap' do
302
- @instance_clean.framework.sitemap_entries.should ==
303
- @instance_clean.framework.sitemap
304
- end
305
- end
306
-
307
- context 'when an index has been provided' do
308
- it 'returns all entries after that line' do
309
- sitemap = @instance_clean.framework.sitemap
310
- @instance_clean.framework.sitemap_entries( 10 ).should ==
311
- Hash[sitemap.to_a[10..-1]]
312
- end
313
- end
314
- end
315
-
316
- describe '#issues' do
317
- it 'returns an array of issues without variations' do
318
- issues = @instance_clean.framework.issues
319
- issues.should be_any
320
-
321
- issue = issues.first
322
- issue.is_a?( Arachni::Issue ).should be_true
323
- issue.variations.should be_empty
324
- end
325
- end
326
- describe '#issues_as_hash' do
327
- it 'returns an array of issues (as hash) without variations' do
328
- issues = @instance_clean.framework.issues_as_hash
329
- issues.should be_any
330
-
331
- issue = issues.first
332
- issue.is_a?( Hash ).should be_true
333
- issue['variations'].should be_empty
334
- end
335
- end
336
- end
1
+ # require 'spec_helper'
2
+ #
3
+ # describe 'Arachni::RPC::Server::Framework' do
4
+ # before( :all ) do
5
+ # @opts = Arachni::Options.instance
6
+ # @opts.paths.checks = fixtures_path + '/signature_check/'
7
+ # @opts.audit.elements :links, :forms, :cookies
8
+ #
9
+ # @instance = instance_light_grid_spawn
10
+ # @framework = @instance.framework
11
+ # @checks = @instance.checks
12
+ # @plugins = @instance.plugins
13
+ #
14
+ # @instance_clean = instance_light_grid_spawn
15
+ # @framework_clean = @instance_clean.framework
16
+ #
17
+ # @statistics_keys = [:http, :found_pages, :audited_pages, :runtime]
18
+ # end
19
+ #
20
+ # describe '#errors' do
21
+ # context 'when no argument has been provided' do
22
+ # it 'returns all logged errors' do
23
+ # test = 'Test'
24
+ # @framework.error_test test
25
+ # expect(@framework.errors.last).to end_with test
26
+ # end
27
+ # end
28
+ # context 'when a start line-range has been provided' do
29
+ # it 'returns all logged errors after that line' do
30
+ # initial_errors = @framework.errors
31
+ # errors = @framework.errors( 10 )
32
+ #
33
+ # expect(initial_errors[10..-1]).to eq(errors)
34
+ # end
35
+ # end
36
+ # end
37
+ #
38
+ # describe '#busy?' do
39
+ # context 'when the scan is not running' do
40
+ # it 'returns false' do
41
+ # expect(@framework_clean.busy?).to be_falsey
42
+ # end
43
+ # end
44
+ # context 'when the scan is running' do
45
+ # it 'returns true' do
46
+ # @instance.options.url = web_server_url_for( :auditor )
47
+ # @checks.load( 'taint' )
48
+ # expect(@framework.run).to be_truthy
49
+ # expect(@framework.busy?).to be_truthy
50
+ # end
51
+ # end
52
+ # end
53
+ # describe '#version' do
54
+ # it 'returns the system version' do
55
+ # expect(@framework_clean.version).to eq(Arachni::VERSION)
56
+ # end
57
+ # end
58
+ # describe '#master?' do
59
+ # it 'returns false' do
60
+ # expect(@framework_clean.master?).to be_truthy
61
+ # end
62
+ # end
63
+ # describe '#slave?' do
64
+ # it 'returns false' do
65
+ # expect(@framework_clean.slave?).to be_falsey
66
+ # end
67
+ # end
68
+ # describe '#solo?' do
69
+ # it 'returns true' do
70
+ # expect(@framework_clean.solo?).to be_falsey
71
+ # end
72
+ # end
73
+ # describe '#set_as_master' do
74
+ # it 'sets the instance as the master' do
75
+ # instance = instance_spawn
76
+ # expect(instance.framework.master?).to be_falsey
77
+ # instance.framework.set_as_master
78
+ # expect(instance.framework.master?).to be_truthy
79
+ #
80
+ # instance_kill instance.url
81
+ # end
82
+ # end
83
+ # describe '#enslave' do
84
+ # it 'enslaves another instance and set itself as its master' do
85
+ # master = instance_spawn
86
+ # slave = instance_spawn
87
+ #
88
+ # expect(master.framework.master?).to be_falsey
89
+ # master.framework.enslave(
90
+ # 'url' => slave.url,
91
+ # 'token' => instance_token_for( slave )
92
+ # )
93
+ # expect(master.framework.master?).to be_truthy
94
+ #
95
+ # instance_kill master.url
96
+ # end
97
+ # end
98
+ # describe '#run' do
99
+ # it 'performs a scan' do
100
+ # instance = @instance_clean
101
+ # instance.options.url = web_server_url_for( :framework_multi )
102
+ # instance.checks.load( 'taint' )
103
+ # expect(instance.framework.run).to be_truthy
104
+ # sleep( 1 ) while instance.framework.busy?
105
+ # expect(instance.framework.issues.size).to eq(500)
106
+ # end
107
+ #
108
+ # it 'handles pages with JavaScript code' do
109
+ # instance = instance_light_grid_spawn
110
+ # instance.options.url = web_server_url_for( :auditor ) + '/with_javascript'
111
+ # instance.checks.load :signature
112
+ #
113
+ # expect(instance.framework.run).to be_truthy
114
+ # sleep 0.1 while instance.framework.busy?
115
+ #
116
+ # expect(instance.framework.issues.
117
+ # map { |i| i.vector.affected_input_name }.uniq).to be
118
+ # %w(link_input form_input cookie_input)
119
+ #
120
+ # # dispatcher_kill_by_instance instance
121
+ # end
122
+ #
123
+ # it 'handles AJAX' do
124
+ # instance = instance_light_grid_spawn
125
+ # instance.options.url = web_server_url_for( :auditor ) + '/with_ajax'
126
+ # instance.checks.load :signature
127
+ #
128
+ # expect(instance.framework.run).to be_truthy
129
+ # sleep 0.1 while instance.framework.busy?
130
+ #
131
+ # expect(instance.framework.issues.
132
+ # map { |i| i.vector.affected_input_name }.uniq).to be
133
+ # %w(link_input form_input cookie_taint).sort
134
+ #
135
+ # # dispatcher_kill_by_instance instance
136
+ # end
137
+ # end
138
+ # describe '#report' do
139
+ # it 'returns an report object' do
140
+ # report = @instance_clean.framework.report
141
+ # expect(report.is_a?( Arachni::Report )).to be_truthy
142
+ # expect(report.issues).to be_any
143
+ # end
144
+ # end
145
+ # describe '#statistics' do
146
+ # it 'returns a hash containing general runtime statistics' do
147
+ # statistics = @instance_clean.framework.statistics
148
+ #
149
+ # keys = @statistics_keys | [:current_page]
150
+ #
151
+ # expect(statistics.keys.sort).to eq(keys.sort)
152
+ # keys.each { |k| expect(statistics[k]).to be_truthy }
153
+ # end
154
+ # end
155
+ # describe '#clean_up' do
156
+ # it 'sets the framework state to finished, waits for plugins to finish and merges their results' do
157
+ # @instance = instance = instance_light_grid_spawn
158
+ # instance.options.url = web_server_url_for( :framework_multi )
159
+ # instance.checks.load( 'taint' )
160
+ # instance.plugins.load( { 'wait' => {}, 'distributable' => {} } )
161
+ # expect(instance.framework.run).to be_truthy
162
+ # expect(instance.framework.report.plugins).to be_empty
163
+ #
164
+ # # Wait till the slaves join the scan.
165
+ # sleep 0.1 while instance.framework.progress[:instances].size != 3
166
+ #
167
+ # expect(instance.framework.clean_up).to be_truthy
168
+ #
169
+ # instance_count = instance.framework.progress[:instances].size
170
+ # report = instance.framework.report
171
+ #
172
+ # results = report.plugins
173
+ # expect(results).to be_any
174
+ # expect(results[:wait]).to be_any
175
+ # expect(results[:wait][:results]).to eq({ 'stuff' => true })
176
+ # expect(results[:distributable][:results]).to eq({ 'stuff' => instance_count })
177
+ #
178
+ # # dispatcher_kill_by_instance instance
179
+ # end
180
+ # end
181
+ # describe '#progress' do
182
+ # before { @progress_keys = %W(statistics status busy issues instances).map(&:to_sym).sort }
183
+ #
184
+ # context 'when called without options' do
185
+ # it 'returns all progress data' do
186
+ # instance = @instance_clean
187
+ #
188
+ # data = instance.framework.progress
189
+ #
190
+ # expect(data.keys.sort).to eq((@progress_keys | [:master]).flatten.sort)
191
+ #
192
+ # expect(data[:statistics].keys.sort).to eq(
193
+ # (@statistics_keys | [:current_pages]).flatten.sort
194
+ # )
195
+ #
196
+ # expect(data[:status]).to be_kind_of Symbol
197
+ # expect(data[:master]).to eq(instance.url)
198
+ # expect(data[:busy]).not_to be_nil
199
+ # expect(data[:issues]).to be_any
200
+ # expect(data[:instances].size).to eq(3)
201
+ #
202
+ # expect(data).not_to include :errors
203
+ #
204
+ # keys = (@statistics_keys | [:current_page]).flatten.sort
205
+ #
206
+ # data[:instances].each do |i|
207
+ # expect(i[:statistics].keys.sort).to eq(keys)
208
+ # expect(i.keys.sort).to eq([:url, :statistics, :status, :busy, :messages].sort)
209
+ # end
210
+ #
211
+ # data.delete :issues
212
+ # end
213
+ # end
214
+ #
215
+ # context 'when called with option' do
216
+ # describe :errors do
217
+ # context 'when set to true' do
218
+ # it 'includes all error messages' do
219
+ # instance = instance_light_grid_spawn
220
+ # expect(instance.framework.progress( errors: true )[:errors]).to be_empty
221
+ #
222
+ # test = 'Test'
223
+ # instance.framework.error_test test
224
+ #
225
+ # expect(instance.framework.progress( errors: true )[:errors].last).to end_with test
226
+ #
227
+ # # dispatcher_kill_by_instance instance
228
+ # end
229
+ # end
230
+ # context 'when set to an Integer' do
231
+ # it 'returns all logged errors after that line per Instance' do
232
+ # instance = instance_light_grid_spawn
233
+ #
234
+ # 100.times { instance.framework.error_test 'test' }
235
+ #
236
+ # expect(instance.framework.progress( errors: true )[:errors].size -
237
+ # instance.framework.progress( errors: 10 )[:errors].size).to eq(10)
238
+ #
239
+ # # dispatcher_kill_by_instance instance
240
+ # end
241
+ # end
242
+ # end
243
+ #
244
+ # describe :sitemap do
245
+ # context 'when set to true' do
246
+ # it 'returns entire sitemap' do
247
+ # expect(@instance_clean.framework.
248
+ # progress( sitemap: true )[:sitemap]).to eq(
249
+ # @instance_clean.framework.sitemap
250
+ # )
251
+ # end
252
+ # end
253
+ #
254
+ # context 'when an index has been provided' do
255
+ # it 'returns all entries after that line' do
256
+ # expect(@instance_clean.framework.progress( sitemap: 10 )[:sitemap]).to eq(
257
+ # @instance_clean.framework.sitemap_entries( 10 )
258
+ # )
259
+ # end
260
+ # end
261
+ # end
262
+ #
263
+ # describe :statistics do
264
+ # context 'when set to false' do
265
+ # it 'excludes statistics' do
266
+ # expect(@instance_clean.framework.progress(
267
+ # statistics: false
268
+ # )).not_to include :statistics
269
+ # end
270
+ # end
271
+ # end
272
+ # describe :issues do
273
+ # context 'when set to false' do
274
+ # it 'excludes issues' do
275
+ # expect(@instance_clean.framework.progress(
276
+ # issues: false
277
+ # )).not_to include :issues
278
+ # end
279
+ # end
280
+ # end
281
+ # describe :slaves do
282
+ # context 'when set to false' do
283
+ # it 'excludes slave data' do
284
+ # expect(@instance_clean.framework.progress(
285
+ # slaves: false
286
+ # )).not_to include :instances
287
+ # end
288
+ # end
289
+ # end
290
+ # describe :as_hash do
291
+ # context 'when set to true' do
292
+ # it 'includes issues as a hash' do
293
+ # expect(@instance_clean.framework.
294
+ # progress( as_hash: true )[:issues].
295
+ # first.is_a?( Hash )).to be_truthy
296
+ # end
297
+ # end
298
+ # end
299
+ # end
300
+ # end
301
+ #
302
+ # describe '#sitemap_entries' do
303
+ # context 'when no argument has been provided' do
304
+ # it 'returns entire sitemap' do
305
+ # expect(@instance_clean.framework.sitemap_entries).to eq(
306
+ # @instance_clean.framework.sitemap
307
+ # )
308
+ # end
309
+ # end
310
+ #
311
+ # context 'when an index has been provided' do
312
+ # it 'returns all entries after that line' do
313
+ # sitemap = @instance_clean.framework.sitemap
314
+ # expect(@instance_clean.framework.sitemap_entries( 10 )).to eq(
315
+ # Hash[sitemap.to_a[10..-1]]
316
+ # )
317
+ # end
318
+ # end
319
+ # end
320
+ #
321
+ # describe '#issues' do
322
+ # it 'returns an array of issues' do
323
+ # issues = @instance_clean.framework.issues
324
+ # expect(issues).to be_any
325
+ #
326
+ # issue = issues.first
327
+ # expect(issue.is_a?( Arachni::Issue )).to be_truthy
328
+ # end
329
+ # end
330
+ #
331
+ # describe '#issues_as_hash' do
332
+ # it 'returns an array of issues as hash' do
333
+ # issues = @instance_clean.framework.issues_as_hash
334
+ # expect(issues).to be_any
335
+ #
336
+ # issue = issues.first
337
+ # expect(issue.is_a?( Hash )).to be_truthy
338
+ # end
339
+ # end
340
+ # end