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
@@ -20,13 +20,13 @@ describe Arachni::Plugin::Base do
|
|
20
20
|
|
21
21
|
describe '.distributable?' do
|
22
22
|
it 'returns false' do
|
23
|
-
described_class.
|
23
|
+
expect(described_class).not_to be_distributable
|
24
24
|
end
|
25
25
|
|
26
26
|
context 'when the distributable flag has been set' do
|
27
27
|
it 'returns true' do
|
28
28
|
described_class.distributable
|
29
|
-
described_class.
|
29
|
+
expect(described_class).to be_distributable
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -34,31 +34,31 @@ describe Arachni::Plugin::Base do
|
|
34
34
|
describe '.is_distributable' do
|
35
35
|
it 'sets the distributable? flag' do
|
36
36
|
described_class.is_distributable
|
37
|
-
described_class.
|
37
|
+
expect(described_class).to be_distributable
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
describe '#info' do
|
42
42
|
it 'returns .info' do
|
43
|
-
subject.info.
|
43
|
+
expect(subject.info).to eq(described_class.info)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
describe '#session' do
|
48
48
|
it "returns #{Arachni::Framework}#session" do
|
49
|
-
subject.session.
|
49
|
+
expect(subject.session).to eq(framework.session)
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
describe '#http' do
|
54
54
|
it "returns #{Arachni::Framework}#http" do
|
55
|
-
subject.http.
|
55
|
+
expect(subject.http).to eq(framework.http)
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
59
|
describe '#framework_pause' do
|
60
60
|
it 'pauses the framework' do
|
61
|
-
framework.
|
61
|
+
expect(framework).to receive(:pause)
|
62
62
|
subject.framework_pause
|
63
63
|
end
|
64
64
|
end
|
@@ -69,14 +69,14 @@ describe Arachni::Plugin::Base do
|
|
69
69
|
|
70
70
|
subject.framework_pause
|
71
71
|
|
72
|
-
framework.
|
72
|
+
expect(framework).to receive(:resume)
|
73
73
|
subject.framework_resume
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
77
|
describe '#wait_while_framework_running' do
|
78
78
|
it 'blocks while the framework runs' do
|
79
|
-
framework.
|
79
|
+
expect(framework).to be_running
|
80
80
|
|
81
81
|
q = Queue.new
|
82
82
|
Thread.new do
|
@@ -90,7 +90,7 @@ describe Arachni::Plugin::Base do
|
|
90
90
|
q.pop
|
91
91
|
end
|
92
92
|
|
93
|
-
framework.
|
93
|
+
expect(framework).not_to be_running
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
@@ -29,18 +29,18 @@ describe Arachni::Plugin::Manager do
|
|
29
29
|
let(:state) { Arachni::State.plugins.runtime }
|
30
30
|
|
31
31
|
it 'stores plugin options' do
|
32
|
-
state[:suspendable][:options].
|
32
|
+
expect(state[:suspendable][:options]).to eq({
|
33
33
|
my_option: 'updated'
|
34
|
-
}
|
34
|
+
})
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'stores plugin state' do
|
38
|
-
state.
|
39
|
-
state[:suspendable][:data].
|
38
|
+
expect(state).to include :suspendable
|
39
|
+
expect(state[:suspendable][:data]).to eq(1)
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'kills the running plugins' do
|
43
|
-
subject.jobs.
|
43
|
+
expect(subject.jobs).to be_empty
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -63,45 +63,45 @@ describe Arachni::Plugin::Manager do
|
|
63
63
|
it 'restores plugin options' do
|
64
64
|
subject.restore
|
65
65
|
|
66
|
-
subject.jobs[:suspendable][:instance].options.
|
66
|
+
expect(subject.jobs[:suspendable][:instance].options).to eq({
|
67
67
|
my_option: 'updated'
|
68
|
-
}
|
68
|
+
})
|
69
69
|
end
|
70
70
|
|
71
71
|
it 'restores plugin state' do
|
72
72
|
subject.restore
|
73
|
-
subject.jobs[:suspendable][:instance].counter.
|
73
|
+
expect(subject.jobs[:suspendable][:instance].counter).to eq(2)
|
74
74
|
end
|
75
75
|
|
76
76
|
context 'when a loaded plugin has no associated state' do
|
77
77
|
it "calls #{Arachni::Plugin::Base}#prepare instead of #{Arachni::Plugin::Base}#restore" do
|
78
78
|
subject.state.delete :suspendable
|
79
79
|
subject.restore
|
80
|
-
subject.jobs[:suspendable][:instance].counter.
|
80
|
+
expect(subject.jobs[:suspendable][:instance].counter).to eq(1)
|
81
81
|
end
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
85
|
describe '#load_default' do
|
86
86
|
it 'loads default plugins' do
|
87
|
-
subject.
|
87
|
+
expect(subject).to be_empty
|
88
88
|
subject.load_default
|
89
|
-
subject.include?( 'default' ).
|
89
|
+
expect(subject.include?( 'default' )).to be_truthy
|
90
90
|
subject.clear
|
91
91
|
end
|
92
92
|
it 'aliased to #load_defaults' do
|
93
|
-
subject.
|
93
|
+
expect(subject).to be_empty
|
94
94
|
subject.load_defaults
|
95
|
-
subject.include?( 'default' ).
|
95
|
+
expect(subject.include?( 'default' )).to be_truthy
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
99
|
describe '#default' do
|
100
100
|
it 'returns the default plugins' do
|
101
|
-
subject.default.include?( 'default' ).
|
101
|
+
expect(subject.default.include?( 'default' )).to be_truthy
|
102
102
|
end
|
103
103
|
it 'aliased to #defaults' do
|
104
|
-
subject.defaults.include?( 'default' ).
|
104
|
+
expect(subject.defaults.include?( 'default' )).to be_truthy
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
@@ -110,18 +110,18 @@ describe Arachni::Plugin::Manager do
|
|
110
110
|
subject.load_default
|
111
111
|
subject.run
|
112
112
|
subject.block
|
113
|
-
subject.results[:default][:results].
|
113
|
+
expect(subject.results[:default][:results]).to be_truthy
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
117
|
describe '#schedule' do
|
118
118
|
it 'returns scheduled plugins' do
|
119
119
|
subject.load_default
|
120
|
-
subject.schedule.
|
120
|
+
expect(subject.schedule).to eq({
|
121
121
|
default: {
|
122
122
|
int_opt: 4
|
123
123
|
}
|
124
|
-
}
|
124
|
+
})
|
125
125
|
end
|
126
126
|
|
127
127
|
context 'when plugins have :priority' do
|
@@ -137,10 +137,10 @@ describe Arachni::Plugin::Manager do
|
|
137
137
|
it 'orders them based on priority' do
|
138
138
|
subject.load '*'
|
139
139
|
scheduled = subject.schedule.keys
|
140
|
-
scheduled[0..1].sort.
|
141
|
-
scheduled[2].
|
142
|
-
scheduled[3..5].sort.
|
143
|
-
scheduled[6..7].sort.
|
140
|
+
expect(scheduled[0..1].sort).to eq([:p0, :p00].sort)
|
141
|
+
expect(scheduled[2]).to eq(:p1)
|
142
|
+
expect(scheduled[3..5].sort).to eq([:p22, :p222, :p2].sort)
|
143
|
+
expect(scheduled[6..7].sort).to eq([:p_nil, :p_nil2].sort)
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
@@ -155,12 +155,12 @@ describe Arachni::Plugin::Manager do
|
|
155
155
|
describe '#sane_env?' do
|
156
156
|
context 'when gem dependencies are met' do
|
157
157
|
it 'returns true' do
|
158
|
-
subject.sane_env?( subject['default'] ).
|
158
|
+
expect(subject.sane_env?( subject['default'] )).to eq(true)
|
159
159
|
end
|
160
160
|
end
|
161
161
|
context 'when gem dependencies are not met' do
|
162
162
|
it 'returns a hash with errors' do
|
163
|
-
subject.sane_env?( subject['bad'] ).include?( :gem_errors ).
|
163
|
+
expect(subject.sane_env?( subject['bad'] ).include?( :gem_errors )).to be_truthy
|
164
164
|
subject.delete( 'bad' )
|
165
165
|
end
|
166
166
|
end
|
@@ -168,7 +168,7 @@ describe Arachni::Plugin::Manager do
|
|
168
168
|
|
169
169
|
describe '#create' do
|
170
170
|
it 'returns a plugin instance' do
|
171
|
-
subject.create( 'default' ).instance_of?( subject['default'] ).
|
171
|
+
expect(subject.create( 'default' ).instance_of?( subject['default'] )).to be_truthy
|
172
172
|
end
|
173
173
|
end
|
174
174
|
|
@@ -177,7 +177,7 @@ describe Arachni::Plugin::Manager do
|
|
177
177
|
it 'returns true' do
|
178
178
|
subject.load :wait
|
179
179
|
subject.run
|
180
|
-
subject.busy
|
180
|
+
expect(subject.busy?).to be_truthy
|
181
181
|
framework.state.running = false
|
182
182
|
subject.block
|
183
183
|
end
|
@@ -186,7 +186,7 @@ describe Arachni::Plugin::Manager do
|
|
186
186
|
it 'returns false' do
|
187
187
|
subject.run
|
188
188
|
subject.block
|
189
|
-
subject.busy
|
189
|
+
expect(subject.busy?).to be_falsey
|
190
190
|
end
|
191
191
|
end
|
192
192
|
end
|
@@ -195,7 +195,7 @@ describe Arachni::Plugin::Manager do
|
|
195
195
|
context 'when plugins are running' do
|
196
196
|
it 'returns the names of the running plugins' do
|
197
197
|
subject.run
|
198
|
-
subject.job_names.
|
198
|
+
expect(subject.job_names).to eq(subject.keys)
|
199
199
|
subject.block
|
200
200
|
end
|
201
201
|
end
|
@@ -203,7 +203,7 @@ describe Arachni::Plugin::Manager do
|
|
203
203
|
it 'returns an empty array' do
|
204
204
|
subject.run
|
205
205
|
subject.block
|
206
|
-
subject.job_names.
|
206
|
+
expect(subject.job_names).to be_empty
|
207
207
|
end
|
208
208
|
end
|
209
209
|
end
|
@@ -213,7 +213,7 @@ describe Arachni::Plugin::Manager do
|
|
213
213
|
it 'returns the plugins threads' do
|
214
214
|
subject.load :wait
|
215
215
|
subject.run
|
216
|
-
subject.jobs[:wait].
|
216
|
+
expect(subject.jobs[:wait]).to be_instance_of Thread
|
217
217
|
|
218
218
|
framework.state.running = false
|
219
219
|
|
@@ -227,7 +227,7 @@ describe Arachni::Plugin::Manager do
|
|
227
227
|
framework.state.running = false
|
228
228
|
|
229
229
|
subject.block
|
230
|
-
subject.jobs.
|
230
|
+
expect(subject.jobs).to be_empty
|
231
231
|
end
|
232
232
|
end
|
233
233
|
end
|
@@ -240,7 +240,7 @@ describe Arachni::Plugin::Manager do
|
|
240
240
|
ret = subject.kill( 'loop' )
|
241
241
|
subject.block
|
242
242
|
|
243
|
-
ret.
|
243
|
+
expect(ret).to be_truthy
|
244
244
|
subject.delete( 'loop' )
|
245
245
|
end
|
246
246
|
end
|
@@ -249,31 +249,32 @@ describe Arachni::Plugin::Manager do
|
|
249
249
|
it 'returns false' do
|
250
250
|
subject.run
|
251
251
|
subject.block
|
252
|
-
subject.kill( 'default' ).
|
252
|
+
expect(subject.kill( 'default' )).to be_falsey
|
253
253
|
end
|
254
254
|
end
|
255
255
|
end
|
256
256
|
|
257
257
|
describe '#results' do
|
258
258
|
it "delegates to ##{Arachni::Data::Plugins}#results" do
|
259
|
-
Arachni::Data.plugins.results.object_id.
|
259
|
+
expect(Arachni::Data.plugins.results.object_id).to eq(
|
260
260
|
subject.results.object_id
|
261
|
+
)
|
261
262
|
end
|
262
263
|
end
|
263
264
|
|
264
265
|
describe '#reset' do
|
265
266
|
it 'calls #kill' do
|
266
|
-
subject.
|
267
|
+
expect(subject).to receive(:killall).at_least(1).times
|
267
268
|
subject.reset
|
268
269
|
end
|
269
270
|
|
270
271
|
it 'calls #clear' do
|
271
|
-
subject.
|
272
|
+
expect(subject).to receive(:clear).at_least(1).times
|
272
273
|
subject.reset
|
273
274
|
end
|
274
275
|
|
275
276
|
it 'calls .reset' do
|
276
|
-
described_class.
|
277
|
+
expect(described_class).to receive(:reset).at_least(1).times
|
277
278
|
subject.reset
|
278
279
|
end
|
279
280
|
end
|
data/spec/arachni/report_spec.rb
CHANGED
@@ -23,7 +23,7 @@ describe Arachni::Report do
|
|
23
23
|
cloned = Arachni::RPC::Serializer.deep_clone( report )
|
24
24
|
cloned.options.delete :input
|
25
25
|
|
26
|
-
report.
|
26
|
+
expect(report).to eq(cloned)
|
27
27
|
end
|
28
28
|
|
29
29
|
describe '#to_rpc_data' do
|
@@ -32,13 +32,14 @@ describe Arachni::Report do
|
|
32
32
|
|
33
33
|
%w(sitemap version).each do |attribute|
|
34
34
|
it "includes '#{attribute}'" do
|
35
|
-
data[attribute].
|
35
|
+
expect(data[attribute]).to eq(subject.send( attribute ))
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
it "includes 'options'" do
|
40
|
-
data['options'].
|
40
|
+
expect(data['options']).to eq(
|
41
41
|
Arachni::Options.update( subject.options ).to_rpc_data
|
42
|
+
)
|
42
43
|
end
|
43
44
|
|
44
45
|
it "includes 'plugins'" do
|
@@ -48,17 +49,17 @@ describe Arachni::Report do
|
|
48
49
|
info_1 = data['plugins'].each { |name, d| d.delete :options }
|
49
50
|
info_2 = subject.plugins.each { |name, d| d.delete :options }
|
50
51
|
|
51
|
-
info_1.
|
52
|
-
options_1.
|
52
|
+
expect(info_1).to eq(info_2)
|
53
|
+
expect(options_1).to eq(options_2)
|
53
54
|
end
|
54
55
|
|
55
56
|
it "includes 'issues'" do
|
56
|
-
data['issues'].
|
57
|
+
expect(data['issues']).to eq(subject.issues.map(&:to_rpc_data))
|
57
58
|
end
|
58
59
|
|
59
60
|
%w(start_datetime finish_datetime).each do |attribute|
|
60
61
|
it "includes '#{attribute}'" do
|
61
|
-
data[attribute].
|
62
|
+
expect(data[attribute]).to eq(subject.send( attribute ).to_s)
|
62
63
|
end
|
63
64
|
end
|
64
65
|
end
|
@@ -71,7 +72,7 @@ describe Arachni::Report do
|
|
71
72
|
|
72
73
|
%w(sitemap issues plugins version).each do |attribute|
|
73
74
|
it "restores '#{attribute}'" do
|
74
|
-
restored.send( attribute ).
|
75
|
+
expect(restored.send( attribute )).to eq(subject.send( attribute ))
|
75
76
|
end
|
76
77
|
end
|
77
78
|
|
@@ -79,32 +80,32 @@ describe Arachni::Report do
|
|
79
80
|
restored.options.delete :input
|
80
81
|
subject.options.delete :input
|
81
82
|
|
82
|
-
restored.options.
|
83
|
+
expect(restored.options).to eq(subject.options)
|
83
84
|
end
|
84
85
|
|
85
86
|
%w(start_datetime finish_datetime).each do |attribute|
|
86
87
|
it "restores '#{attribute}'" do
|
87
|
-
restored.send( attribute ).
|
88
|
-
restored.send( attribute ).to_s.
|
88
|
+
expect(restored.send( attribute )).to be_kind_of Time
|
89
|
+
expect(restored.send( attribute ).to_s).to eq(subject.send( attribute ).to_s)
|
89
90
|
end
|
90
91
|
end
|
91
92
|
end
|
92
93
|
|
93
94
|
describe '#version' do
|
94
95
|
it 'returns the version number' do
|
95
|
-
report.version.
|
96
|
+
expect(report.version).to eq(Arachni::VERSION)
|
96
97
|
end
|
97
98
|
end
|
98
99
|
|
99
100
|
describe '#url' do
|
100
101
|
it 'returns the targeted URL' do
|
101
|
-
report.url.
|
102
|
+
expect(report.url).to eq(report.options[:url])
|
102
103
|
end
|
103
104
|
end
|
104
105
|
|
105
106
|
describe '#options' do
|
106
107
|
it 'returns Arachni::Options as a hash' do
|
107
|
-
report.options.
|
108
|
+
expect(report.options).to eq(Arachni::Options.to_hash)
|
108
109
|
end
|
109
110
|
|
110
111
|
it 'defaults to Arachni::Options#to_hash' do
|
@@ -114,26 +115,26 @@ describe Arachni::Report do
|
|
114
115
|
new.delete :input
|
115
116
|
hash.delete :input
|
116
117
|
|
117
|
-
new.
|
118
|
+
expect(new).to eq(hash)
|
118
119
|
end
|
119
120
|
end
|
120
121
|
|
121
122
|
describe '#sitemap' do
|
122
123
|
it 'returns the sitemap' do
|
123
|
-
report.sitemap.
|
124
|
+
expect(report.sitemap).to eq({@opts.url.to_s => 200})
|
124
125
|
end
|
125
126
|
end
|
126
127
|
|
127
128
|
describe '#issues' do
|
128
129
|
it 'returns the issues' do
|
129
130
|
issues = [Factory[:issue]]
|
130
|
-
described_class.new( issues: issues ).issues.
|
131
|
+
expect(described_class.new( issues: issues ).issues).to eq(issues)
|
131
132
|
end
|
132
133
|
end
|
133
134
|
|
134
135
|
describe '#issue_by_check' do
|
135
136
|
it 'returns issue logged by the given check' do
|
136
|
-
report.issues.
|
137
|
+
expect(report.issues).to be_any
|
137
138
|
|
138
139
|
report.issues.first.check[:shortname] << 'stuff'
|
139
140
|
|
@@ -141,63 +142,64 @@ describe Arachni::Report do
|
|
141
142
|
|
142
143
|
filtered_issues = report.issues_by_check( check )
|
143
144
|
filtered_issues.each do |issue|
|
144
|
-
issue.check[:shortname].
|
145
|
+
expect(issue.check[:shortname]).to eq(check)
|
145
146
|
end
|
146
147
|
|
147
|
-
report.issues.size.
|
148
|
+
expect(report.issues.size).to be > filtered_issues.size
|
148
149
|
end
|
149
150
|
end
|
150
151
|
|
151
152
|
describe '#issue_by_digest' do
|
152
153
|
it 'returns an issue based on its digest' do
|
153
|
-
report.issues.
|
154
|
+
expect(report.issues).to be_any
|
154
155
|
|
155
156
|
report.issues.each do |issue|
|
156
|
-
report.issue_by_digest( issue.digest ).
|
157
|
+
expect(report.issue_by_digest( issue.digest )).to eq(issue)
|
157
158
|
end
|
158
159
|
end
|
159
160
|
end
|
160
161
|
|
161
162
|
describe '#plugins' do
|
162
163
|
it 'returns the plugin results' do
|
163
|
-
report.plugins.
|
164
|
+
expect(report.plugins).to eq(Factory[:report_data][:plugins])
|
164
165
|
end
|
165
166
|
end
|
166
167
|
|
167
168
|
describe '#start_datetime' do
|
168
169
|
it 'returns a Time object' do
|
169
|
-
report.start_datetime.
|
170
|
+
expect(report.start_datetime).to be_kind_of Time
|
170
171
|
end
|
171
172
|
context 'when no start datetime info has been provided' do
|
172
173
|
it 'falls-back to Time.now' do
|
173
|
-
report_empty.start_datetime.
|
174
|
+
expect(report_empty.start_datetime).to be_kind_of Time
|
174
175
|
end
|
175
176
|
end
|
176
177
|
end
|
177
178
|
|
178
179
|
describe '#finish_datetime' do
|
179
180
|
it 'returns a Time object' do
|
180
|
-
report.finish_datetime.
|
181
|
+
expect(report.finish_datetime).to be_kind_of Time
|
181
182
|
end
|
182
183
|
it 'returns the start finish of the scan' do
|
183
|
-
report.finish_datetime.to_s.
|
184
|
+
expect(report.finish_datetime.to_s).to eq(
|
184
185
|
Factory[:report_data][:finish_datetime].to_s
|
186
|
+
)
|
185
187
|
end
|
186
188
|
context 'when no start datetime info has been provided' do
|
187
189
|
it 'falls-back to Time.now' do
|
188
|
-
report_empty.finish_datetime.
|
190
|
+
expect(report_empty.finish_datetime).to be_kind_of Time
|
189
191
|
end
|
190
192
|
end
|
191
193
|
end
|
192
194
|
|
193
195
|
describe '#delta_time' do
|
194
196
|
it 'returns the time difference between start and finish time' do
|
195
|
-
report.delta_time.
|
197
|
+
expect(report.delta_time).to eq('02:46:40')
|
196
198
|
end
|
197
199
|
context 'when no #finish_datetime has been provided' do
|
198
200
|
it 'uses Time.now for the calculation' do
|
199
201
|
report_empty.start_datetime = Time.now - 2000
|
200
|
-
report_empty.delta_time.to_s.
|
202
|
+
expect(report_empty.delta_time.to_s).to eq('00:33:19')
|
201
203
|
end
|
202
204
|
end
|
203
205
|
end
|
@@ -205,8 +207,9 @@ describe Arachni::Report do
|
|
205
207
|
describe '.read_summary' do
|
206
208
|
it 'returns summary' do
|
207
209
|
@report_file = report.save
|
208
|
-
described_class.read_summary( @report_file ).
|
210
|
+
expect(described_class.read_summary( @report_file )).to eq(
|
209
211
|
Arachni::RPC::Serializer.load( Arachni::RPC::Serializer.dump( report.summary ) )
|
212
|
+
)
|
210
213
|
end
|
211
214
|
end
|
212
215
|
|
@@ -214,7 +217,7 @@ describe Arachni::Report do
|
|
214
217
|
it 'dumps the object to a file' do
|
215
218
|
@report_file = report.save
|
216
219
|
|
217
|
-
described_class.load( @report_file ).
|
220
|
+
expect(described_class.load( @report_file )).to eq(report)
|
218
221
|
end
|
219
222
|
|
220
223
|
context 'when given a location' do
|
@@ -223,7 +226,7 @@ describe Arachni::Report do
|
|
223
226
|
@report_file = 'report'
|
224
227
|
report.save( @report_file )
|
225
228
|
|
226
|
-
described_class.load( @report_file ).
|
229
|
+
expect(described_class.load( @report_file )).to eq(report)
|
227
230
|
end
|
228
231
|
end
|
229
232
|
|
@@ -232,7 +235,7 @@ describe Arachni::Report do
|
|
232
235
|
directory = Dir.tmpdir
|
233
236
|
@report_file = report.save( directory )
|
234
237
|
|
235
|
-
described_class.load( @report_file ).
|
238
|
+
expect(described_class.load( @report_file )).to eq(report)
|
236
239
|
end
|
237
240
|
end
|
238
241
|
end
|
@@ -242,13 +245,13 @@ describe Arachni::Report do
|
|
242
245
|
it 'returns the object in AFR format' do
|
243
246
|
@report_file = report.save
|
244
247
|
|
245
|
-
IO.binread( @report_file ).
|
248
|
+
expect(IO.binread( @report_file )).to eq(report.to_afr)
|
246
249
|
end
|
247
250
|
end
|
248
251
|
|
249
252
|
describe '#to_h' do
|
250
253
|
it 'returns the object as a hash' do
|
251
|
-
report.to_h.
|
254
|
+
expect(report.to_h).to eq({
|
252
255
|
version: report.version,
|
253
256
|
options: Arachni::Options.hash_to_rpc_data( report.options ),
|
254
257
|
sitemap: report.sitemap,
|
@@ -272,27 +275,27 @@ describe Arachni::Report do
|
|
272
275
|
]
|
273
276
|
}
|
274
277
|
}
|
275
|
-
}
|
278
|
+
})
|
276
279
|
end
|
277
280
|
end
|
278
281
|
|
279
282
|
describe '#to_hash' do
|
280
283
|
it 'alias of #to_h' do
|
281
|
-
report.to_h.
|
284
|
+
expect(report.to_h).to eq(report.to_hash)
|
282
285
|
end
|
283
286
|
end
|
284
287
|
|
285
288
|
describe '#==' do
|
286
289
|
context 'when the reports are equal' do
|
287
290
|
it 'returns true' do
|
288
|
-
report.deep_clone.
|
291
|
+
expect(report.deep_clone).to eq(report)
|
289
292
|
end
|
290
293
|
end
|
291
294
|
context 'when the reports are not equal' do
|
292
295
|
it 'returns false' do
|
293
296
|
a = report.deep_clone
|
294
297
|
a.options[:url] = 'http://stuff/'
|
295
|
-
a.
|
298
|
+
expect(a).not_to eq(report)
|
296
299
|
end
|
297
300
|
end
|
298
301
|
end
|