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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -0
- data/Gemfile +1 -1
- data/README.md +16 -5
- data/components/checks/active/ldap_injection/errors.txt +1 -0
- data/components/checks/active/source_code_disclosure.rb +1 -1
- data/components/checks/active/unvalidated_redirect.rb +6 -6
- data/components/checks/active/unvalidated_redirect_dom.rb +10 -7
- data/components/checks/passive/grep/captcha.rb +14 -5
- data/components/checks/passive/grep/form_upload.rb +7 -3
- data/components/checks/passive/grep/hsts.rb +3 -3
- data/components/checks/passive/grep/html_objects.rb +2 -3
- data/components/checks/passive/grep/http_only_cookies.rb +2 -3
- data/components/checks/passive/grep/insecure_cookies.rb +1 -1
- data/components/checks/passive/grep/password_autocomplete.rb +2 -2
- data/components/checks/passive/grep/unencrypted_password_forms.rb +7 -7
- data/components/checks/passive/grep/x_frame_options.rb +2 -2
- data/components/checks/passive/http_put.rb +2 -3
- data/components/path_extractors/comments.rb +3 -3
- data/components/path_extractors/scripts.rb +10 -1
- data/components/plugins/defaults/autothrottle.rb +27 -18
- data/components/plugins/defaults/meta/remedies/discovery.rb +30 -33
- data/components/plugins/defaults/meta/remedies/timing_attacks.rb +7 -11
- data/components/plugins/login_script.rb +9 -3
- data/components/plugins/proxy.rb +4 -3
- data/components/reporters/html.rb +11 -14
- data/components/reporters/html/default/issue.erb +13 -38
- data/components/reporters/html/default/issue/info.erb +1 -1
- data/components/reporters/html/default/summary/issues/by_name.erb +3 -3
- data/components/reporters/stdout.rb +62 -71
- data/components/reporters/xml.rb +26 -40
- data/components/reporters/xml/schema.xsd +43 -89
- data/lib/arachni/browser.rb +52 -3
- data/lib/arachni/browser/javascript.rb +3 -3
- data/lib/arachni/browser/javascript/scripts/taint_tracer.js +46 -25
- data/lib/arachni/browser_cluster.rb +61 -0
- data/lib/arachni/browser_cluster/job.rb +21 -1
- data/lib/arachni/browser_cluster/jobs/browser_provider.rb +3 -1
- data/lib/arachni/browser_cluster/jobs/resource_exploration.rb +2 -1
- data/lib/arachni/browser_cluster/jobs/resource_exploration/event_trigger.rb +2 -1
- data/lib/arachni/browser_cluster/jobs/taint_trace.rb +3 -2
- data/lib/arachni/browser_cluster/jobs/taint_trace/event_trigger.rb +1 -1
- data/lib/arachni/browser_cluster/worker.rb +5 -0
- data/lib/arachni/check/auditor.rb +22 -12
- data/lib/arachni/data/framework.rb +13 -1
- data/lib/arachni/data/issues.rb +9 -25
- data/lib/arachni/element/base.rb +9 -3
- data/lib/arachni/element/capabilities/analyzable.rb +2 -6
- data/lib/arachni/element/capabilities/analyzable/differential.rb +24 -7
- data/lib/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +23 -23
- data/lib/arachni/element/capabilities/auditable.rb +0 -6
- data/lib/arachni/element/capabilities/dom_only.rb +61 -0
- data/lib/arachni/element/capabilities/with_dom.rb +3 -1
- data/lib/arachni/element/cookie.rb +35 -5
- data/lib/arachni/element/cookie/dom.rb +13 -4
- data/lib/arachni/element/{capabilities/auditable/dom.rb → dom.rb} +20 -68
- data/lib/arachni/element/dom/capabilities/auditable.rb +29 -0
- data/lib/arachni/element/dom/capabilities/inputtable.rb +27 -0
- data/lib/arachni/element/dom/capabilities/mutable.rb +21 -0
- data/lib/arachni/element/dom/capabilities/submittable.rb +52 -0
- data/lib/arachni/element/form.rb +12 -1
- data/lib/arachni/element/form/capabilities/mutable.rb +2 -1
- data/lib/arachni/element/form/capabilities/with_dom.rb +0 -1
- data/lib/arachni/element/form/dom.rb +9 -3
- data/lib/arachni/element/header.rb +14 -33
- data/lib/arachni/element/header/capabilities/inputtable.rb +29 -0
- data/lib/arachni/element/header/capabilities/mutable.rb +51 -0
- data/lib/arachni/element/input/dom.rb +71 -0
- data/lib/arachni/element/json.rb +2 -0
- data/lib/arachni/element/link.rb +3 -0
- data/lib/arachni/element/link/capabilities/with_dom.rb +0 -1
- data/lib/arachni/element/link/dom.rb +16 -3
- data/lib/arachni/element/link/dom/capabilities/submittable.rb +29 -0
- data/lib/arachni/element/link_template.rb +3 -5
- data/lib/arachni/element/link_template/capabilities/inputtable.rb +5 -0
- data/lib/arachni/element/link_template/capabilities/with_dom.rb +0 -1
- data/lib/arachni/element/link_template/dom.rb +16 -3
- data/lib/arachni/element/link_template/dom/capabilities/submittable.rb +29 -0
- data/lib/arachni/element/server.rb +3 -5
- data/lib/arachni/element/ui_form.rb +106 -0
- data/lib/arachni/element/ui_form/dom.rb +107 -0
- data/lib/arachni/element/ui_input.rb +62 -0
- data/lib/arachni/element/xml.rb +2 -1
- data/lib/arachni/framework.rb +7 -5
- data/lib/arachni/framework/parts/audit.rb +0 -1
- data/lib/arachni/framework/parts/check.rb +1 -0
- data/lib/arachni/framework/parts/data.rb +4 -0
- data/lib/arachni/framework/parts/state.rb +0 -2
- data/lib/arachni/http/client.rb +17 -6
- data/lib/arachni/http/proxy_server.rb +52 -5
- data/lib/arachni/http/request.rb +1 -1
- data/lib/arachni/issue.rb +34 -179
- data/lib/arachni/issue/severity.rb +2 -0
- data/lib/arachni/option_groups/audit.rb +22 -2
- data/lib/arachni/option_groups/browser_cluster.rb +15 -0
- data/lib/arachni/page.rb +3 -2
- data/lib/arachni/parser.rb +24 -5
- data/lib/arachni/platform/manager.rb +1 -2
- data/lib/arachni/rpc/server/framework.rb +3 -4
- data/lib/arachni/rpc/server/framework/multi_instance.rb +2 -1
- data/lib/arachni/session.rb +1 -1
- data/lib/arachni/trainer.rb +4 -7
- data/lib/arachni/watir/element.rb +12 -1
- data/lib/version +1 -1
- data/spec/arachni/browser/element_locator_spec.rb +43 -43
- data/spec/arachni/browser/javascript/dom_monitor_spec.rb +44 -44
- data/spec/arachni/browser/javascript/proxy/stub_spec.rb +17 -14
- data/spec/arachni/browser/javascript/proxy_spec.rb +24 -24
- data/spec/arachni/browser/javascript/taint_tracer/frame/called_function_spec.rb +11 -11
- data/spec/arachni/browser/javascript/taint_tracer/frame_spec.rb +7 -7
- data/spec/arachni/browser/javascript/taint_tracer/sink/data_flow_spec.rb +13 -13
- data/spec/arachni/browser/javascript/taint_tracer/sink/execution_flow_spec.rb +7 -7
- data/spec/arachni/browser/javascript/taint_tracer_spec.rb +568 -558
- data/spec/arachni/browser/javascript_spec.rb +73 -63
- data/spec/arachni/browser_cluster/job/result_spec.rb +3 -3
- data/spec/arachni/browser_cluster/job_spec.rb +68 -48
- data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger/result_spec.rb +2 -2
- data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger_spec.rb +5 -4
- data/spec/arachni/browser_cluster/jobs/resource_exploration/result_spec.rb +2 -2
- data/spec/arachni/browser_cluster/jobs/resource_exploration_spec.rb +5 -5
- data/spec/arachni/browser_cluster/worker_spec.rb +87 -70
- data/spec/arachni/browser_cluster_spec.rb +64 -39
- data/spec/arachni/browser_spec.rb +692 -527
- data/spec/arachni/check/auditor_spec.rb +177 -147
- data/spec/arachni/check/base_spec.rb +33 -33
- data/spec/arachni/check/manager_spec.rb +15 -15
- data/spec/arachni/component/base_spec.rb +8 -8
- data/spec/arachni/component/manager_spec.rb +100 -99
- data/spec/arachni/component/options/address_spec.rb +3 -3
- data/spec/arachni/component/options/base_spec.rb +7 -7
- data/spec/arachni/component/options/bool_spec.rb +9 -9
- data/spec/arachni/component/options/float_spec.rb +6 -6
- data/spec/arachni/component/options/int_spec.rb +5 -5
- data/spec/arachni/component/options/multiple_choice_spec.rb +12 -12
- data/spec/arachni/component/options/object_spec.rb +2 -2
- data/spec/arachni/component/options/path_spec.rb +3 -3
- data/spec/arachni/component/options/port_spec.rb +5 -5
- data/spec/arachni/component/options/string_spec.rb +3 -3
- data/spec/arachni/component/options/url_spec.rb +4 -4
- data/spec/arachni/component/utilities_spec.rb +2 -2
- data/spec/arachni/data/framework/rpc_spec.rb +10 -9
- data/spec/arachni/data/framework_spec.rb +65 -46
- data/spec/arachni/data/issues_spec.rb +39 -77
- data/spec/arachni/data/plugins_spec.rb +11 -11
- data/spec/arachni/data/session_spec.rb +6 -6
- data/spec/arachni/data_spec.rb +8 -8
- data/spec/arachni/element/body_spec.rb +10 -10
- data/spec/arachni/element/capabilities/analyzable/differential_spec.rb +39 -21
- data/spec/arachni/element/capabilities/analyzable/{taint_spec.rb → signature_spec.rb} +63 -63
- data/spec/arachni/element/capabilities/analyzable/timeout_spec.rb +51 -51
- data/spec/arachni/element/capabilities/with_scope/scope_spec.rb +5 -5
- data/spec/arachni/element/cookie/dom_spec.rb +37 -18
- data/spec/arachni/element/cookie_spec.rb +206 -139
- data/spec/arachni/element/form/dom_spec.rb +36 -19
- data/spec/arachni/element/form_spec.rb +210 -187
- data/spec/arachni/element/generic_dom_spec.rb +14 -14
- data/spec/arachni/element/header_spec.rb +35 -17
- data/spec/arachni/element/json_spec.rb +53 -31
- data/spec/arachni/element/link/dom_spec.rb +46 -28
- data/spec/arachni/element/link_spec.rb +58 -40
- data/spec/arachni/element/link_template/dom_spec.rb +47 -29
- data/spec/arachni/element/link_template_spec.rb +79 -61
- data/spec/arachni/element/path_spec.rb +1 -1
- data/spec/arachni/element/server_spec.rb +33 -32
- data/spec/arachni/element/ui_form/ui_form_dom_spec.rb +164 -0
- data/spec/arachni/element/ui_form_spec.rb +242 -0
- data/spec/arachni/element/ui_input/dom_spec.rb +157 -0
- data/spec/arachni/element/ui_input_spec.rb +136 -0
- data/spec/arachni/element/xml_spec.rb +42 -24
- data/spec/arachni/element_filter_spec.rb +49 -48
- data/spec/arachni/error_spec.rb +3 -3
- data/spec/arachni/framework/parts/audit_spec.rb +64 -63
- data/spec/arachni/framework/parts/browser_spec.rb +16 -16
- data/spec/arachni/framework/parts/check_spec.rb +3 -3
- data/spec/arachni/framework/parts/data_spec.rb +48 -48
- data/spec/arachni/framework/parts/platform_spec.rb +3 -3
- data/spec/arachni/framework/parts/plugin_spec.rb +7 -6
- data/spec/arachni/framework/parts/report_spec.rb +7 -7
- data/spec/arachni/framework/parts/scope_spec.rb +16 -16
- data/spec/arachni/framework/parts/state_spec.rb +68 -69
- data/spec/arachni/framework_spec.rb +39 -31
- data/spec/arachni/http/client/dynamic_404_handlers_spec.rb +32 -32
- data/spec/arachni/http/client_spec.rb +219 -208
- data/spec/arachni/http/cookie_jar_spec.rb +72 -72
- data/spec/arachni/http/headers_spec.rb +14 -14
- data/spec/arachni/http/proxy_server_spec.rb +43 -42
- data/spec/arachni/http/request_spec.rb +105 -103
- data/spec/arachni/http/response/scope_spec.rb +24 -24
- data/spec/arachni/http/response_spec.rb +50 -49
- data/spec/arachni/issue/severity_spec.rb +10 -9
- data/spec/arachni/issue_spec.rb +71 -369
- data/spec/arachni/option_groups/audit_spec.rb +114 -114
- data/spec/arachni/option_groups/browser_cluster_spec.rb +20 -3
- data/spec/arachni/option_groups/datastore_spec.rb +6 -6
- data/spec/arachni/option_groups/dispatcher_spec.rb +19 -19
- data/spec/arachni/option_groups/http_spec.rb +11 -11
- data/spec/arachni/option_groups/input_spec.rb +31 -27
- data/spec/arachni/option_groups/output_spec.rb +2 -2
- data/spec/arachni/option_groups/paths_spec.rb +17 -17
- data/spec/arachni/option_groups/rpc_spec.rb +2 -2
- data/spec/arachni/option_groups/scope_spec.rb +40 -40
- data/spec/arachni/option_groups/session_spec.rb +6 -5
- data/spec/arachni/option_groups/snapshot_spec.rb +4 -4
- data/spec/arachni/options_spec.rb +46 -45
- data/spec/arachni/page/dom/transition_spec.rb +74 -72
- data/spec/arachni/page/dom_spec.rb +35 -35
- data/spec/arachni/page/scope_spec.rb +15 -15
- data/spec/arachni/page_spec.rb +217 -217
- data/spec/arachni/parser_spec.rb +106 -104
- data/spec/arachni/platform/fingerprinter_spec.rb +17 -14
- data/spec/arachni/platform/list_spec.rb +33 -33
- data/spec/arachni/platform/manager_spec.rb +67 -64
- data/spec/arachni/plugin/base_spec.rb +10 -10
- data/spec/arachni/plugin/manager_spec.rb +38 -37
- data/spec/arachni/report_spec.rb +43 -40
- data/spec/arachni/reporter/base_spec.rb +15 -15
- data/spec/arachni/reporter/manager_spec.rb +4 -4
- data/spec/arachni/reporter/options_spec.rb +6 -6
- data/spec/arachni/rpc/client/base_spec.rb +6 -6
- data/spec/arachni/rpc/client/dispatcher_spec.rb +2 -2
- data/spec/arachni/rpc/client/instance_spec.rb +6 -6
- data/spec/arachni/rpc/server/active_options_spec.rb +11 -8
- data/spec/arachni/rpc/server/base_spec.rb +5 -5
- data/spec/arachni/rpc/server/checks/manager_spec.rb +8 -8
- data/spec/arachni/rpc/server/dispatcher/node_spec.rb +37 -37
- data/spec/arachni/rpc/server/dispatcher/service_spec.rb +15 -14
- data/spec/arachni/rpc/server/dispatcher_spec.rb +36 -35
- data/spec/arachni/rpc/server/framework/distributor_spec.rb +36 -36
- data/spec/arachni/rpc/server/framework_multi_spec.rb +340 -336
- data/spec/arachni/rpc/server/framework_spec.rb +90 -85
- data/spec/arachni/rpc/server/instance_spec.rb +126 -107
- data/spec/arachni/rpc/server/output_spec.rb +1 -1
- data/spec/arachni/rpc/server/plugin/manager_spec.rb +6 -6
- data/spec/arachni/ruby/array_spec.rb +42 -42
- data/spec/arachni/ruby/hash_spec.rb +20 -18
- data/spec/arachni/ruby/io_spec.rb +2 -2
- data/spec/arachni/ruby/object_spec.rb +1 -1
- data/spec/arachni/ruby/set_spec.rb +3 -3
- data/spec/arachni/ruby/string_spec.rb +30 -30
- data/spec/arachni/ruby/webrick_spec.rb +2 -2
- data/spec/arachni/scope_spec.rb +1 -1
- data/spec/arachni/session_spec.rb +67 -64
- data/spec/arachni/snapshot_spec.rb +15 -15
- data/spec/arachni/state/audit_spec.rb +11 -11
- data/spec/arachni/state/element_filter_spec.rb +6 -6
- data/spec/arachni/state/framework/rpc_spec.rb +12 -12
- data/spec/arachni/state/framework_spec.rb +125 -121
- data/spec/arachni/state/http_spec.rb +7 -7
- data/spec/arachni/state/options_spec.rb +7 -7
- data/spec/arachni/state/plugins_spec.rb +8 -8
- data/spec/arachni/state_spec.rb +10 -10
- data/spec/arachni/support/buffer/autoflush_spec.rb +16 -16
- data/spec/arachni/support/buffer/base_spec.rb +39 -39
- data/spec/arachni/support/cache/least_cost_replacement_spec.rb +18 -18
- data/spec/arachni/support/cache/least_recently_pushed_spec.rb +24 -24
- data/spec/arachni/support/cache/least_recently_used_spec.rb +20 -20
- data/spec/arachni/support/cache/preference_spec.rb +4 -4
- data/spec/arachni/support/cache/random_replacement_spec.rb +8 -8
- data/spec/arachni/support/crypto/rsa_aes_cbc_spec.rb +1 -1
- data/spec/arachni/support/database/hash_spec.rb +44 -43
- data/spec/arachni/support/database/queue_spec.rb +27 -27
- data/spec/arachni/support/lookup/hash_set_spec.rb +8 -8
- data/spec/arachni/support/lookup/moolb_spec.rb +3 -3
- data/spec/arachni/support/mixins/observable_spec.rb +6 -6
- data/spec/arachni/support/signature_spec.rb +19 -19
- data/spec/arachni/trainer_spec.rb +39 -39
- data/spec/arachni/typhoeus/hydra_spec.rb +2 -2
- data/spec/arachni/uri/scope_spec.rb +66 -66
- data/spec/arachni/uri_spec.rb +107 -105
- data/spec/arachni/utilities_spec.rb +40 -40
- data/spec/components/checks/active/csrf_spec.rb +8 -8
- data/spec/components/checks/active/no_sql_injection_spec.rb +1 -1
- data/spec/components/checks/active/sql_injection_spec.rb +16 -16
- data/spec/components/checks/active/trainer_spec.rb +4 -4
- data/spec/components/checks/active/unvalidated_redirect_dom_spec.rb +4 -2
- data/spec/components/checks/active/xpath_injection_spec.rb +1 -1
- data/spec/components/checks/active/xss_dom_script_context_spec.rb +51 -21
- data/spec/components/checks/active/xss_dom_spec.rb +46 -24
- data/spec/components/checks/passive/allowed_methods_spec.rb +1 -1
- data/spec/components/checks/passive/grep/cookie_set_for_parent_domain_spec.rb +1 -1
- data/spec/components/checks/passive/grep/hsts_spec.rb +2 -2
- data/spec/components/checks/passive/grep/http_only_cookies_spec.rb +1 -1
- data/spec/components/checks/passive/grep/insecure_cookies_spec.rb +1 -1
- data/spec/components/checks/passive/grep/insecure_cors_policy_spec.rb +2 -2
- data/spec/components/checks/passive/grep/password_autocomplete_spec.rb +1 -1
- data/spec/components/checks/passive/grep/private_ip_spec.rb +3 -3
- data/spec/components/checks/passive/grep/unencrypted_password_forms_spec.rb +1 -1
- data/spec/components/checks/passive/grep/x_frame_options_spec.rb +2 -2
- data/spec/components/checks/passive/interesting_responses_spec.rb +2 -2
- data/spec/components/checks/passive/webdav_spec.rb +1 -1
- data/spec/components/checks/passive/xst_spec.rb +1 -1
- data/spec/components/fingerprinters/servers/apache_spec.rb +2 -2
- data/spec/components/path_extractors/comments_spec.rb +5 -1
- data/spec/components/path_extractors/scripts_spec.rb +5 -2
- data/spec/components/plugins/autologin_spec.rb +22 -22
- data/spec/components/plugins/autothrottle_spec.rb +6 -5
- data/spec/components/plugins/content_types_spec.rb +4 -4
- data/spec/components/plugins/cookie_collector_spec.rb +5 -5
- data/spec/components/plugins/exec_spec.rb +12 -12
- data/spec/components/plugins/form_dicattack_spec.rb +3 -3
- data/spec/components/plugins/headers_collector_spec.rb +8 -8
- data/spec/components/plugins/healthmap_spec.rb +3 -3
- data/spec/components/plugins/http_dicattack_spec.rb +3 -3
- data/spec/components/plugins/login_script_spec.rb +79 -22
- data/spec/components/plugins/meta/remedies/discovery_spec.rb +3 -2
- data/spec/components/plugins/meta/remedies/timing_attacks_spec.rb +3 -3
- data/spec/components/plugins/meta/uniformity_spec.rb +2 -2
- data/spec/components/plugins/restrict_to_dom_state_spec.rb +1 -1
- data/spec/components/plugins/script_spec.rb +1 -1
- data/spec/components/plugins/uncommon_headers_spec.rb +2 -2
- data/spec/components/plugins/vector_collector_spec.rb +2 -2
- data/spec/components/plugins/vector_feed_spec.rb +40 -40
- data/spec/components/plugins/waf_detector_spec.rb +6 -6
- data/spec/components/reporters/json_spec.rb +4 -4
- data/spec/components/reporters/marshal_spec.rb +2 -2
- data/spec/components/reporters/yaml_spec.rb +3 -2
- data/spec/external/wavsep/active/sqli_spec.rb +1 -3
- data/spec/spec_helper.rb +4 -0
- data/spec/support/factories/element/ui_form.rb +14 -0
- data/spec/support/factories/element/ui_input.rb +13 -0
- data/spec/support/factories/issue.rb +0 -13
- data/spec/support/fixtures/report.afr +0 -0
- data/spec/support/fixtures/{taint_check/taint.rb → signature_check/signature.rb} +2 -2
- data/spec/support/helpers/browser_cluster/jobs/taint_tracer.rb +11 -11
- data/spec/support/helpers/framework.rb +1 -1
- data/spec/support/helpers/pages.rb +2 -2
- data/spec/support/servers/arachni/browser.rb +139 -0
- data/spec/support/servers/arachni/browser/javascript/taint_tracer.rb +40 -0
- data/spec/support/servers/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +0 -0
- data/spec/support/servers/arachni/element/input/input_dom.rb +102 -0
- data/spec/support/servers/arachni/element/ui_form/ui_form_dom.rb +238 -0
- data/spec/support/servers/checks/active/trainer_check.rb +7 -7
- data/spec/support/servers/checks/active/unvalidated_redirect_dom.rb +22 -6
- data/spec/support/servers/checks/active/xss_dom.rb +50 -0
- data/spec/support/servers/checks/active/xss_dom_script_context.rb +53 -0
- data/spec/support/shared/browser/javascript/taint_tracer/sink/base.rb +6 -6
- data/spec/support/shared/check.rb +10 -12
- data/spec/support/shared/component/options/base.rb +24 -24
- data/spec/support/shared/element/base.rb +25 -25
- data/spec/support/shared/element/capabilities/auditable.rb +116 -140
- data/spec/support/shared/element/capabilities/dom_only.rb +65 -0
- data/spec/support/shared/element/capabilities/inputtable.rb +71 -86
- data/spec/support/shared/element/capabilities/mutable.rb +122 -111
- data/spec/support/shared/element/capabilities/refreshable.rb +10 -10
- data/spec/support/shared/element/capabilities/{submitable.rb → submittable.rb} +26 -26
- data/spec/support/shared/element/capabilities/with_auditor.rb +10 -10
- data/spec/support/shared/element/capabilities/with_dom.rb +8 -8
- data/spec/support/shared/element/capabilities/with_node.rb +4 -6
- data/spec/support/shared/element/capabilities/with_scope.rb +2 -2
- data/spec/support/shared/element/capabilities/with_source.rb +6 -8
- data/spec/support/shared/element/dom.rb +144 -0
- data/spec/support/shared/element/dom/auditable.rb +42 -0
- data/spec/support/shared/element/dom/inputtable.rb +5 -0
- data/spec/support/shared/element/dom/mutable.rb +3 -0
- data/spec/support/shared/element/dom/submittable.rb +119 -0
- data/spec/support/shared/external/wavsep.rb +3 -3
- data/spec/support/shared/fingerprinter.rb +2 -2
- data/spec/support/shared/framework.rb +1 -1
- data/spec/support/shared/http/message.rb +9 -9
- data/spec/support/shared/option_group.rb +17 -17
- data/spec/support/shared/path_extractor.rb +1 -1
- data/spec/support/shared/plugin.rb +2 -2
- data/spec/support/shared/support/cache.rb +57 -57
- data/spec/support/shared/support/lookup.rb +25 -25
- data/ui/cli/framework.rb +22 -11
- data/ui/cli/framework/option_parser.rb +15 -0
- data/ui/cli/option_parser.rb +8 -1
- data/ui/cli/output.rb +2 -1
- metadata +54 -20
- data/components/checks/active/xss_dom_inputs.rb +0 -236
- data/spec/components/checks/active/xss_dom_inputs_spec.rb +0 -30
- data/spec/support/servers/checks/active/xss_dom_inputs.rb +0 -59
- data/spec/support/shared/element/capabilities/auditable/dom.rb +0 -322
@@ -15,19 +15,21 @@ class MockWorker
|
|
15
15
|
end
|
16
16
|
|
17
17
|
class JobTest < Arachni::BrowserCluster::Job
|
18
|
+
include RSpec::Matchers
|
19
|
+
|
18
20
|
def ran?
|
19
21
|
!!@ran
|
20
22
|
end
|
21
23
|
|
22
24
|
def run
|
23
|
-
browser.class.
|
25
|
+
expect(browser.class).to eq MockWorker
|
24
26
|
@ran = true
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
28
30
|
class JobConfigureAndRunTest < JobTest
|
29
31
|
def run
|
30
|
-
browser.class.
|
32
|
+
expect(browser.class).to eq MockWorker
|
31
33
|
super
|
32
34
|
end
|
33
35
|
end
|
@@ -42,8 +44,8 @@ class JobSaveResultTest < JobTest
|
|
42
44
|
save_result my_data: val
|
43
45
|
|
44
46
|
result = browser.master.result
|
45
|
-
result.job.id.
|
46
|
-
result.my_data.
|
47
|
+
expect(result.job.id).to eq self.id
|
48
|
+
expect(result.my_data).to eq val
|
47
49
|
|
48
50
|
super
|
49
51
|
end
|
@@ -51,13 +53,13 @@ end
|
|
51
53
|
|
52
54
|
class JobCleanCopyTest < JobTest
|
53
55
|
def run
|
54
|
-
browser.class.
|
56
|
+
expect(browser.class).to eq MockWorker
|
55
57
|
|
56
58
|
copy = self.clean_copy
|
57
|
-
copy.browser.
|
58
|
-
copy.id.
|
59
|
+
expect(copy.browser).to eq nil
|
60
|
+
expect(copy.id).to eq self.id
|
59
61
|
|
60
|
-
browser.class.
|
62
|
+
expect(browser.class).to eq MockWorker
|
61
63
|
|
62
64
|
super
|
63
65
|
end
|
@@ -89,7 +91,7 @@ describe Arachni::BrowserCluster::Job do
|
|
89
91
|
id = described_class.new.id
|
90
92
|
next if i == 0
|
91
93
|
|
92
|
-
described_class.new.id.
|
94
|
+
expect(described_class.new.id).to eq(id + 1)
|
93
95
|
end
|
94
96
|
end
|
95
97
|
end
|
@@ -101,20 +103,20 @@ describe Arachni::BrowserCluster::Job do
|
|
101
103
|
context true do
|
102
104
|
it 'returns true' do
|
103
105
|
subject.never_ending = true
|
104
|
-
subject.never_ending
|
106
|
+
expect(subject.never_ending?).to be_truthy
|
105
107
|
end
|
106
108
|
end
|
107
109
|
|
108
110
|
context false do
|
109
111
|
it 'returns false' do
|
110
112
|
subject.never_ending = false
|
111
|
-
subject.never_ending
|
113
|
+
expect(subject.never_ending?).to be_falsey
|
112
114
|
end
|
113
115
|
end
|
114
116
|
|
115
117
|
context nil do
|
116
118
|
it 'returns false' do
|
117
|
-
subject.never_ending
|
119
|
+
expect(subject.never_ending?).to be_falsey
|
118
120
|
end
|
119
121
|
end
|
120
122
|
end
|
@@ -128,16 +130,16 @@ describe Arachni::BrowserCluster::Job do
|
|
128
130
|
end
|
129
131
|
|
130
132
|
it 'calls #run' do
|
131
|
-
subject.ran
|
133
|
+
expect(subject.ran?).to be_falsey
|
132
134
|
subject.configure_and_run( worker )
|
133
|
-
subject.ran
|
135
|
+
expect(subject.ran?).to be_truthy
|
134
136
|
end
|
135
137
|
|
136
138
|
it 'removes #browser' do
|
137
|
-
subject.ran
|
139
|
+
expect(subject.ran?).to be_falsey
|
138
140
|
subject.configure_and_run( worker )
|
139
|
-
subject.browser.
|
140
|
-
subject.ran
|
141
|
+
expect(subject.browser).to be_nil
|
142
|
+
expect(subject.ran?).to be_truthy
|
141
143
|
end
|
142
144
|
end
|
143
145
|
|
@@ -145,9 +147,9 @@ describe Arachni::BrowserCluster::Job do
|
|
145
147
|
subject { JobSaveResultTest.new }
|
146
148
|
|
147
149
|
it 'forwards the result to the BrowserCluster' do
|
148
|
-
subject.ran
|
150
|
+
expect(subject.ran?).to be_falsey
|
149
151
|
subject.configure_and_run( worker )
|
150
|
-
subject.ran
|
152
|
+
expect(subject.ran?).to be_truthy
|
151
153
|
end
|
152
154
|
end
|
153
155
|
|
@@ -155,9 +157,9 @@ describe Arachni::BrowserCluster::Job do
|
|
155
157
|
subject { JobCleanCopyTest.new }
|
156
158
|
|
157
159
|
it 'copies the Job without the resources set by #configure_and_run' do
|
158
|
-
subject.ran
|
160
|
+
expect(subject.ran?).to be_falsey
|
159
161
|
subject.configure_and_run( worker )
|
160
|
-
subject.ran
|
162
|
+
expect(subject.ran?).to be_truthy
|
161
163
|
end
|
162
164
|
end
|
163
165
|
|
@@ -165,11 +167,29 @@ describe Arachni::BrowserCluster::Job do
|
|
165
167
|
subject { JobDupTest.new( never_ending: true, my_data: 'stuff' ) }
|
166
168
|
|
167
169
|
it 'copies the Job' do
|
168
|
-
subject.my_data.
|
170
|
+
expect(subject.my_data).to eq('stuff')
|
171
|
+
|
172
|
+
dup = subject.dup
|
173
|
+
expect(dup.my_data).to eq('stuff')
|
174
|
+
expect(dup.never_ending?).to eq(true)
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'preserves #time' do
|
178
|
+
subject.time = 10
|
179
|
+
expect(subject.time).to eq 10
|
180
|
+
|
181
|
+
dup = subject.dup
|
182
|
+
expect(dup.time).to eq 10
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'preserves #timed_out' do
|
186
|
+
subject.timed_out! 10
|
187
|
+
expect(subject.time).to eq 10
|
188
|
+
expect(subject).to be_timed_out
|
169
189
|
|
170
190
|
dup = subject.dup
|
171
|
-
dup.
|
172
|
-
|
191
|
+
expect(dup.time).to eq 10
|
192
|
+
expect(subject).to be_timed_out
|
173
193
|
end
|
174
194
|
end
|
175
195
|
|
@@ -178,33 +198,33 @@ describe Arachni::BrowserCluster::Job do
|
|
178
198
|
|
179
199
|
it 'sets the original Job as the #forwarder' do
|
180
200
|
id = subject.id
|
181
|
-
subject.forward.forwarder.
|
201
|
+
expect(subject.forward.forwarder).to eq(subject)
|
182
202
|
end
|
183
203
|
|
184
204
|
it 'creates a new Job with the same #id' do
|
185
205
|
id = subject.id
|
186
|
-
subject.forward.id.
|
206
|
+
expect(subject.forward.id).to eq(id)
|
187
207
|
end
|
188
208
|
|
189
209
|
it 'creates a new Job with the same #never_ending' do
|
190
|
-
subject.forward.never_ending
|
210
|
+
expect(subject.forward.never_ending?).to be_falsey
|
191
211
|
|
192
212
|
job = JobForwardTest.new( never_ending: true, my_data: 'stuff' )
|
193
|
-
job.never_ending
|
194
|
-
job.forward.never_ending
|
213
|
+
expect(job.never_ending?).to be_truthy
|
214
|
+
expect(job.forward.never_ending?).to be_truthy
|
195
215
|
|
196
216
|
job = JobForwardTest.new( never_ending: false, my_data: 'stuff' )
|
197
|
-
job.never_ending
|
198
|
-
job.forward.never_ending
|
217
|
+
expect(job.never_ending?).to be_falsey
|
218
|
+
expect(job.forward.never_ending?).to be_falsey
|
199
219
|
end
|
200
220
|
|
201
221
|
it 'does not preserve any existing data' do
|
202
|
-
subject.forward.my_data.
|
222
|
+
expect(subject.forward.my_data).to be_nil
|
203
223
|
end
|
204
224
|
|
205
225
|
context 'when options are given' do
|
206
226
|
it 'sets initialization options' do
|
207
|
-
subject.forward( my_data: 'stuff2' ).my_data.
|
227
|
+
expect(subject.forward( my_data: 'stuff2' ).my_data).to eq('stuff2')
|
208
228
|
end
|
209
229
|
end
|
210
230
|
end
|
@@ -214,49 +234,49 @@ describe Arachni::BrowserCluster::Job do
|
|
214
234
|
|
215
235
|
it 'sets the original Job as the #forwarder' do
|
216
236
|
id = subject.id
|
217
|
-
subject.forward_as( JobForwardAsTest ).forwarder.
|
237
|
+
expect(subject.forward_as( JobForwardAsTest ).forwarder).to eq(subject)
|
218
238
|
end
|
219
239
|
|
220
240
|
it 'creates a new Job type with the same #id' do
|
221
|
-
subject.
|
241
|
+
expect(subject).not_to be_kind_of JobForwardAsTest
|
222
242
|
|
223
243
|
id = subject.id
|
224
244
|
|
225
245
|
forwarded = subject.forward_as( JobForwardAsTest )
|
226
246
|
|
227
|
-
forwarded.id.
|
228
|
-
forwarded.
|
247
|
+
expect(forwarded.id).to eq(id)
|
248
|
+
expect(forwarded).to be_kind_of JobForwardAsTest
|
229
249
|
end
|
230
250
|
|
231
251
|
it 'creates a new Job with the same #never_ending' do
|
232
|
-
subject.forward_as( JobForwardAsTest ).never_ending
|
252
|
+
expect(subject.forward_as( JobForwardAsTest ).never_ending?).to be_falsey
|
233
253
|
|
234
254
|
job = JobForwardTest.new( never_ending: true, my_data: 'stuff' )
|
235
|
-
job.never_ending
|
236
|
-
job.forward_as( JobForwardAsTest ).never_ending
|
255
|
+
expect(job.never_ending?).to be_truthy
|
256
|
+
expect(job.forward_as( JobForwardAsTest ).never_ending?).to be_truthy
|
237
257
|
|
238
258
|
job = JobForwardTest.new( never_ending: false, my_data: 'stuff' )
|
239
|
-
job.never_ending
|
240
|
-
job.forward_as( JobForwardAsTest ).never_ending
|
259
|
+
expect(job.never_ending?).to be_falsey
|
260
|
+
expect(job.forward_as( JobForwardAsTest ).never_ending?).to be_falsey
|
241
261
|
end
|
242
262
|
|
243
263
|
it 'does not preserve any existing data' do
|
244
|
-
subject.
|
264
|
+
expect(subject).not_to be_kind_of JobForwardAsTest
|
245
265
|
|
246
266
|
forwarded = subject.forward_as( JobForwardAsTest )
|
247
267
|
|
248
|
-
forwarded.my_data.
|
249
|
-
forwarded.
|
268
|
+
expect(forwarded.my_data).to be_nil
|
269
|
+
expect(forwarded).to be_kind_of JobForwardAsTest
|
250
270
|
end
|
251
271
|
|
252
272
|
context 'when options are given' do
|
253
273
|
it 'sets initialization options' do
|
254
|
-
subject.
|
274
|
+
expect(subject).not_to be_kind_of JobForwardAsTest
|
255
275
|
|
256
276
|
forwarded = subject.forward_as( JobForwardAsTest, my_data: 'stuff2' )
|
257
277
|
|
258
|
-
forwarded.my_data.
|
259
|
-
forwarded.
|
278
|
+
expect(forwarded.my_data).to eq('stuff2')
|
279
|
+
expect(forwarded).to be_kind_of JobForwardAsTest
|
260
280
|
end
|
261
281
|
end
|
262
282
|
end
|
@@ -2,6 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Arachni::BrowserCluster::Jobs::ResourceExploration::EventTrigger::Result do
|
4
4
|
subject { described_class.new }
|
5
|
-
it {
|
6
|
-
it {
|
5
|
+
it { is_expected.to respond_to :page }
|
6
|
+
it { is_expected.to respond_to :page= }
|
7
7
|
end
|
@@ -25,17 +25,18 @@ describe Arachni::BrowserCluster::Jobs::ResourceExploration::EventTrigger do
|
|
25
25
|
pages = []
|
26
26
|
|
27
27
|
@cluster.queue( job ) do |result|
|
28
|
-
result.
|
28
|
+
expect(result).to be_kind_of described_class::Result
|
29
29
|
pages << result.page
|
30
30
|
end
|
31
31
|
@cluster.wait
|
32
32
|
|
33
|
-
pages.size.
|
33
|
+
expect(pages.size).to eq(2)
|
34
34
|
|
35
35
|
page = pages.last
|
36
|
-
page.dom.transitions.last.event.
|
37
|
-
Nokogiri::HTML( page.body ).xpath("//div[@id='my-div']").first.to_s.
|
36
|
+
expect(page.dom.transitions.last.event).to eq(event)
|
37
|
+
expect(Nokogiri::HTML( page.body ).xpath("//div[@id='my-div']").first.to_s).to eq(
|
38
38
|
'<div id="my-div"><a href="#3">My link</a></div>'
|
39
|
+
)
|
39
40
|
end
|
40
41
|
|
41
42
|
context 'when the resource is a' do
|
@@ -2,6 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Arachni::BrowserCluster::Jobs::ResourceExploration::Result do
|
4
4
|
subject { described_class.new }
|
5
|
-
it {
|
6
|
-
it {
|
5
|
+
it { is_expected.to respond_to :page }
|
6
|
+
it { is_expected.to respond_to :page= }
|
7
7
|
end
|
@@ -15,18 +15,18 @@ describe Arachni::BrowserCluster::Jobs::ResourceExploration do
|
|
15
15
|
has_event_triggers = false
|
16
16
|
|
17
17
|
@cluster.queue( job ) do |result|
|
18
|
-
result.
|
18
|
+
expect(result).to be_kind_of described_class::Result
|
19
19
|
|
20
20
|
if result.job.is_a? described_class::EventTrigger
|
21
21
|
has_event_triggers = true
|
22
|
-
result.job.forwarder.
|
22
|
+
expect(result.job.forwarder).to be_kind_of described_class
|
23
23
|
end
|
24
24
|
|
25
25
|
pages << result.page
|
26
26
|
end
|
27
27
|
@cluster.wait
|
28
28
|
|
29
|
-
has_event_triggers.
|
29
|
+
expect(has_event_triggers).to be_truthy
|
30
30
|
browser_explore_check_pages pages
|
31
31
|
end
|
32
32
|
|
@@ -55,7 +55,7 @@ describe Arachni::BrowserCluster::Jobs::ResourceExploration do
|
|
55
55
|
q << subject
|
56
56
|
|
57
57
|
restored = q.pop
|
58
|
-
restored.
|
58
|
+
expect(restored).to eq(subject)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -73,7 +73,7 @@ describe Arachni::BrowserCluster::Jobs::ResourceExploration do
|
|
73
73
|
q << subject
|
74
74
|
|
75
75
|
restored = q.pop
|
76
|
-
restored.
|
76
|
+
expect(restored).to eq(subject)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
@@ -29,33 +29,33 @@ describe Arachni::BrowserCluster::Worker do
|
|
29
29
|
describe :job_timeout do
|
30
30
|
it 'sets how much time to allow each job to run' do
|
31
31
|
@worker = described_class.new( job_timeout: 10 )
|
32
|
-
@worker.job_timeout.
|
32
|
+
expect(@worker.job_timeout).to eq(10)
|
33
33
|
end
|
34
34
|
|
35
35
|
it "defaults to #{Arachni::OptionGroups::BrowserCluster}#job_timeout" do
|
36
36
|
Arachni::Options.browser_cluster.job_timeout = 5
|
37
37
|
@worker = described_class.new
|
38
|
-
@worker.job_timeout.
|
38
|
+
expect(@worker.job_timeout).to eq(5)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
describe :max_time_to_live do
|
43
43
|
it 'sets how many jobs should be run before respawning' do
|
44
44
|
@worker = described_class.new( max_time_to_live: 10 )
|
45
|
-
@worker.max_time_to_live.
|
45
|
+
expect(@worker.max_time_to_live).to eq(10)
|
46
46
|
end
|
47
47
|
|
48
48
|
it "defaults to #{Arachni::OptionGroups::BrowserCluster}#worker_time_to_live" do
|
49
49
|
Arachni::Options.browser_cluster.worker_time_to_live = 5
|
50
50
|
@worker = described_class.new
|
51
|
-
@worker.max_time_to_live.
|
51
|
+
expect(@worker.max_time_to_live).to eq(5)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
56
|
describe '#run_job' do
|
57
57
|
it 'processes jobs from #master' do
|
58
|
-
subject.
|
58
|
+
expect(subject).to receive(:run_job).with(custom_job)
|
59
59
|
@cluster.queue( custom_job ){}
|
60
60
|
@cluster.wait
|
61
61
|
end
|
@@ -66,7 +66,7 @@ describe Arachni::BrowserCluster::Worker do
|
|
66
66
|
job = subject.job
|
67
67
|
end
|
68
68
|
@cluster.wait
|
69
|
-
job.
|
69
|
+
expect(job).to eq(custom_job)
|
70
70
|
end
|
71
71
|
|
72
72
|
context 'before running the job' do
|
@@ -78,24 +78,24 @@ describe Arachni::BrowserCluster::Worker do
|
|
78
78
|
@cluster.queue( custom_job ){}
|
79
79
|
@cluster.wait
|
80
80
|
|
81
|
-
subject.pid.
|
82
|
-
Process.getpgid( subject.pid ).
|
81
|
+
expect(subject.pid).not_to eq(dead_pid)
|
82
|
+
expect(Process.getpgid( subject.pid )).to be_truthy
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
86
|
context 'when a job fails' do
|
87
87
|
it 'ignores it' do
|
88
|
-
custom_job.
|
89
|
-
subject.run_job( custom_job ).
|
88
|
+
allow(custom_job).to receive(:configure_and_run){ raise 'stuff' }
|
89
|
+
expect(subject.run_job( custom_job )).to be_truthy
|
90
90
|
end
|
91
91
|
|
92
92
|
context Selenium::WebDriver::Error::WebDriverError do
|
93
93
|
it 'respawns' do
|
94
|
-
subject.watir.
|
94
|
+
allow(subject.watir).to receive(:cookies) do
|
95
95
|
raise Selenium::WebDriver::Error::WebDriverError
|
96
96
|
end
|
97
97
|
|
98
|
-
subject.watir.
|
98
|
+
allow(subject.watir).to receive(:close) do
|
99
99
|
raise Selenium::WebDriver::Error::WebDriverError
|
100
100
|
end
|
101
101
|
|
@@ -104,8 +104,8 @@ describe Arachni::BrowserCluster::Worker do
|
|
104
104
|
|
105
105
|
subject.run_job( custom_job )
|
106
106
|
|
107
|
-
watir.
|
108
|
-
pid.
|
107
|
+
expect(watir).not_to eq(subject.watir)
|
108
|
+
expect(pid).not_to eq(subject.pid)
|
109
109
|
end
|
110
110
|
end
|
111
111
|
end
|
@@ -113,79 +113,46 @@ describe Arachni::BrowserCluster::Worker do
|
|
113
113
|
context 'when the job finishes' do
|
114
114
|
let(:page) { Arachni::Page.from_url(url) }
|
115
115
|
|
116
|
-
context 'when there are 5 or more windows open' do
|
117
|
-
before(:each) do
|
118
|
-
5.times do
|
119
|
-
subject.javascript.run( 'window.open()' )
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
it 'respawns PhantomJS' do
|
124
|
-
watir = subject.watir
|
125
|
-
pid = subject.pid
|
126
|
-
|
127
|
-
subject.watir.windows.size.should > 5
|
128
|
-
@cluster.explore( page ) {}
|
129
|
-
@cluster.wait
|
130
|
-
|
131
|
-
watir.should_not == subject.watir
|
132
|
-
pid.should_not == subject.pid
|
133
|
-
subject.watir.windows.size.should == 2
|
134
|
-
end
|
135
|
-
|
136
|
-
it 'clears the cached HTTP responses' do
|
137
|
-
subject.preload page
|
138
|
-
subject.preloads.should be_any
|
139
|
-
subject.instance_variable_get(:@window_responses)
|
140
|
-
|
141
|
-
subject.watir.windows.size.should > 5
|
142
|
-
@cluster.queue( custom_job ) {}
|
143
|
-
@cluster.wait
|
144
|
-
|
145
|
-
subject.instance_variable_get(:@window_responses).should be_empty
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
116
|
it "clears the #{Arachni::Browser::Javascript}#taint" do
|
150
117
|
subject.javascript.taint = 'stuff'
|
151
118
|
|
152
119
|
@cluster.queue( custom_job ) {}
|
153
120
|
@cluster.wait
|
154
121
|
|
155
|
-
subject.javascript.taint.
|
122
|
+
expect(subject.javascript.taint).to be_nil
|
156
123
|
end
|
157
124
|
|
158
125
|
it 'clears #cookies' do
|
159
126
|
subject.preload page
|
160
|
-
subject.preloads.
|
127
|
+
expect(subject.preloads).to be_any
|
161
128
|
|
162
129
|
@cluster.with_browser do |browser|
|
163
130
|
browser.load page
|
164
|
-
subject.cookies.
|
131
|
+
expect(subject.cookies).to be_any
|
165
132
|
end
|
166
133
|
@cluster.wait
|
167
134
|
|
168
|
-
subject.cookies.
|
135
|
+
expect(subject.cookies).to be_empty
|
169
136
|
end
|
170
137
|
|
171
138
|
it 'clears #preloads' do
|
172
139
|
subject.preload page
|
173
|
-
subject.preloads.
|
140
|
+
expect(subject.preloads).to be_any
|
174
141
|
|
175
142
|
@cluster.queue( custom_job ) {}
|
176
143
|
@cluster.wait
|
177
144
|
|
178
|
-
subject.preloads.
|
145
|
+
expect(subject.preloads).to be_empty
|
179
146
|
end
|
180
147
|
|
181
148
|
it 'clears #cache' do
|
182
149
|
subject.cache page
|
183
|
-
subject.cache.
|
150
|
+
expect(subject.cache).to be_any
|
184
151
|
|
185
152
|
@cluster.queue( custom_job ) {}
|
186
153
|
@cluster.wait
|
187
154
|
|
188
|
-
subject.cache.
|
155
|
+
expect(subject.cache).to be_empty
|
189
156
|
end
|
190
157
|
|
191
158
|
it 'clears #captured_pages' do
|
@@ -194,7 +161,7 @@ describe Arachni::BrowserCluster::Worker do
|
|
194
161
|
@cluster.queue( custom_job ) {}
|
195
162
|
@cluster.wait
|
196
163
|
|
197
|
-
subject.captured_pages.
|
164
|
+
expect(subject.captured_pages).to be_empty
|
198
165
|
end
|
199
166
|
|
200
167
|
it 'clears #page_snapshots' do
|
@@ -203,7 +170,7 @@ describe Arachni::BrowserCluster::Worker do
|
|
203
170
|
@cluster.queue( custom_job ) {}
|
204
171
|
@cluster.wait
|
205
172
|
|
206
|
-
subject.page_snapshots.
|
173
|
+
expect(subject.page_snapshots).to be_empty
|
207
174
|
end
|
208
175
|
|
209
176
|
it 'clears #page_snapshots_with_sinks' do
|
@@ -212,7 +179,7 @@ describe Arachni::BrowserCluster::Worker do
|
|
212
179
|
@cluster.queue( custom_job ) {}
|
213
180
|
@cluster.wait
|
214
181
|
|
215
|
-
subject.page_snapshots_with_sinks.
|
182
|
+
expect(subject.page_snapshots_with_sinks).to be_empty
|
216
183
|
end
|
217
184
|
|
218
185
|
it 'clears #on_new_page callbacks' do
|
@@ -221,7 +188,7 @@ describe Arachni::BrowserCluster::Worker do
|
|
221
188
|
@cluster.queue( custom_job ) {}
|
222
189
|
@cluster.wait
|
223
190
|
|
224
|
-
subject.observer_count_for(:on_new_page).
|
191
|
+
expect(subject.observer_count_for(:on_new_page)).to eq(0)
|
225
192
|
end
|
226
193
|
|
227
194
|
it 'clears #on_new_page_with_sink callbacks' do
|
@@ -230,7 +197,7 @@ describe Arachni::BrowserCluster::Worker do
|
|
230
197
|
@cluster.queue( custom_job ){}
|
231
198
|
@cluster.wait
|
232
199
|
|
233
|
-
subject.observer_count_for(:on_new_page_with_sink).
|
200
|
+
expect(subject.observer_count_for(:on_new_page_with_sink)).to eq(0)
|
234
201
|
end
|
235
202
|
|
236
203
|
it 'clears #on_response callbacks' do
|
@@ -239,7 +206,7 @@ describe Arachni::BrowserCluster::Worker do
|
|
239
206
|
@cluster.queue( custom_job ){}
|
240
207
|
@cluster.wait
|
241
208
|
|
242
|
-
subject.observer_count_for(:on_response).
|
209
|
+
expect(subject.observer_count_for(:on_response)).to eq(0)
|
243
210
|
end
|
244
211
|
|
245
212
|
it 'clears #on_fire_event callbacks' do
|
@@ -248,19 +215,58 @@ describe Arachni::BrowserCluster::Worker do
|
|
248
215
|
@cluster.queue( custom_job ){}
|
249
216
|
@cluster.wait
|
250
217
|
|
251
|
-
subject.observer_count_for(:on_fire_event).
|
218
|
+
expect(subject.observer_count_for(:on_fire_event)).to eq(0)
|
252
219
|
end
|
253
220
|
|
254
221
|
it 'removes #job' do
|
255
222
|
@cluster.queue( custom_job ){}
|
256
223
|
@cluster.wait
|
257
|
-
subject.job.
|
224
|
+
expect(subject.job).to be_nil
|
258
225
|
end
|
259
226
|
|
260
227
|
it 'decrements #time_to_live' do
|
261
228
|
@cluster.queue( custom_job ) {}
|
262
229
|
@cluster.wait
|
263
|
-
subject.time_to_live.
|
230
|
+
expect(subject.time_to_live).to eq(subject.max_time_to_live - 1)
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'sets Job#time' do
|
234
|
+
@cluster.queue( custom_job ) {}
|
235
|
+
@cluster.wait
|
236
|
+
expect(custom_job.time).to be > 0
|
237
|
+
end
|
238
|
+
|
239
|
+
context 'when there are 5 or more windows open' do
|
240
|
+
before(:each) do
|
241
|
+
5.times do
|
242
|
+
subject.javascript.run( 'window.open()' )
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
it 'respawns PhantomJS' do
|
247
|
+
watir = subject.watir
|
248
|
+
pid = subject.pid
|
249
|
+
|
250
|
+
expect(subject.watir.windows.size).to be > 5
|
251
|
+
@cluster.explore( page ) {}
|
252
|
+
@cluster.wait
|
253
|
+
|
254
|
+
expect(watir).not_to eq(subject.watir)
|
255
|
+
expect(pid).not_to eq(subject.pid)
|
256
|
+
expect(subject.watir.windows.size).to eq(2)
|
257
|
+
end
|
258
|
+
|
259
|
+
it 'clears the cached HTTP responses' do
|
260
|
+
subject.preload page
|
261
|
+
expect(subject.preloads).to be_any
|
262
|
+
subject.instance_variable_get(:@window_responses)
|
263
|
+
|
264
|
+
expect(subject.watir.windows.size).to be > 5
|
265
|
+
@cluster.queue( custom_job ) {}
|
266
|
+
@cluster.wait
|
267
|
+
|
268
|
+
expect(subject.instance_variable_get(:@window_responses)).to be_empty
|
269
|
+
end
|
264
270
|
end
|
265
271
|
|
266
272
|
context 'when #time_to_live reaches 0' do
|
@@ -278,15 +284,15 @@ describe Arachni::BrowserCluster::Worker do
|
|
278
284
|
@cluster.queue( custom_job ) {}
|
279
285
|
@cluster.wait
|
280
286
|
|
281
|
-
watir.
|
282
|
-
pid.
|
287
|
+
expect(watir).not_to eq(subject.watir)
|
288
|
+
expect(pid).not_to eq(subject.pid)
|
283
289
|
end
|
284
290
|
end
|
285
291
|
|
286
292
|
context 'when cookie clearing raises' do
|
287
293
|
context Selenium::WebDriver::Error::NoSuchWindowError do
|
288
294
|
it 'respawns' do
|
289
|
-
subject.watir.
|
295
|
+
allow(subject.watir).to receive(:cookies) do
|
290
296
|
raise Selenium::WebDriver::Error::NoSuchWindowError
|
291
297
|
end
|
292
298
|
|
@@ -295,18 +301,29 @@ describe Arachni::BrowserCluster::Worker do
|
|
295
301
|
|
296
302
|
subject.run_job( custom_job )
|
297
303
|
|
298
|
-
watir.
|
299
|
-
pid.
|
304
|
+
expect(watir).not_to eq(subject.watir)
|
305
|
+
expect(pid).not_to eq(subject.pid)
|
300
306
|
end
|
301
307
|
end
|
302
308
|
end
|
303
309
|
end
|
304
310
|
|
305
311
|
context 'when the job takes more than #job_timeout' do
|
306
|
-
|
312
|
+
before do
|
307
313
|
subject.job_timeout = 1
|
314
|
+
end
|
315
|
+
|
316
|
+
it 'sets Job#time' do
|
317
|
+
@cluster.queue( sleep_job ) {}
|
318
|
+
@cluster.wait
|
319
|
+
expect(sleep_job.time).to be > 1
|
320
|
+
expect(sleep_job.time).to be < 1.1
|
321
|
+
end
|
322
|
+
|
323
|
+
it 'sets Job#timed_out?' do
|
308
324
|
@cluster.queue( sleep_job ) {}
|
309
325
|
@cluster.wait
|
326
|
+
expect(sleep_job).to be_timed_out
|
310
327
|
end
|
311
328
|
end
|
312
329
|
end
|