# frozen_string_literal: true $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require 'simplecov' # More config is defined in ./.simplecov require 'rspec/its' require 'webmock/rspec' # See http://betterspecs.org/ RSpec.configure do |config| config.expect_with :rspec do |c| c.syntax = :expect end # For --only-failures / --next-failure config.example_status_persistence_file_path = '/tmp/rspec_examples.txt' end def redefine_constant(constant, value) WPScan.send(:remove_const, constant) WPScan.const_set(constant, value) end # Dynamic Finders Helpers def df_expected_all YAML.safe_load(File.read(DYNAMIC_FINDERS_FIXTURES.join('expected.yml'))) end def df_tested_class_constant(type, finder_class, slug = nil) if slug "WPScan::Finders::#{type}::#{classify_slug(slug)}::#{classify_slug(finder_class)}".constantize else "WPScan::Finders::#{type}::#{classify_slug(finder_class)}".constantize end end def df_stubbed_response(fixture, finder_super_class) if finder_super_class == 'HeaderPattern' { headers: JSON.parse(File.read(fixture)) } else { body: File.read(fixture, mode: 'rb') } end end def vuln_api_data_for(path) JSON.parse(File.read(FIXTURES.join('db', 'vuln_api', "#{path}.json"))) end require 'wpscan' require 'shared_examples' def rspec_parsed_options(args) controllers = WPScan::Controller.constants.reject { |c| c == :Base }.reduce(WPScan::Controllers.new) do |a, sym| a << WPScan::Controller.const_get(sym).new end controllers.option_parser.results(args.split(' ')) end # TODO: remove when https://github.com/bblimke/webmock/issues/552 fixed # Also remove from CMSScanner # rubocop:disable all module WebMock module HttpLibAdapters class TyphoeusAdapter < HttpLibAdapter def self.effective_url(effective_uri) effective_uri.port = nil if effective_uri.scheme == 'http' && effective_uri.port == 80 effective_uri.port = nil if effective_uri.scheme == 'https' && effective_uri.port == 443 effective_uri.to_s end def self.generate_typhoeus_response(request_signature, webmock_response) response = if webmock_response.should_timeout ::Typhoeus::Response.new( code: 0, status_message: '', body: '', headers: {}, return_code: :operation_timedout ) else ::Typhoeus::Response.new( code: webmock_response.status[0], status_message: webmock_response.status[1], body: webmock_response.body, headers: webmock_response.headers, effective_url: effective_url(request_signature.uri) ) end response.mock = :webmock response end end end end # rubocop:enable all SPECS = Pathname.new(__FILE__).dirname FIXTURES = SPECS.join('fixtures') FINDERS_FIXTURES = FIXTURES.join('finders') DYNAMIC_FINDERS_FIXTURES = FIXTURES.join('dynamic_finders') ERROR_404_URL_PATTERN = %r{/[a-z\d]{7}\.html$}.freeze redefine_constant(:DB_DIR, FIXTURES.join('db'))