cms_scanner 0.0.2

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 (147) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +6 -0
  5. data/.travis.yml +14 -0
  6. data/Gemfile +6 -0
  7. data/README.md +20 -0
  8. data/Rakefile +9 -0
  9. data/app/app.rb +4 -0
  10. data/app/controllers.rb +2 -0
  11. data/app/controllers/core.rb +46 -0
  12. data/app/controllers/core/cli_options.rb +68 -0
  13. data/app/controllers/interesting_files.rb +12 -0
  14. data/app/finders.rb +1 -0
  15. data/app/finders/interesting_files.rb +21 -0
  16. data/app/finders/interesting_files/fantastico_fileslist.rb +23 -0
  17. data/app/finders/interesting_files/headers.rb +15 -0
  18. data/app/finders/interesting_files/robots_txt.rb +22 -0
  19. data/app/finders/interesting_files/search_replace_db_2.rb +28 -0
  20. data/app/finders/interesting_files/xml_rpc.rb +62 -0
  21. data/app/formatters.rb +3 -0
  22. data/app/formatters/cli.rb +18 -0
  23. data/app/formatters/cli_no_colour.rb +15 -0
  24. data/app/formatters/json.rb +12 -0
  25. data/app/models.rb +5 -0
  26. data/app/models/fantastico_fileslist.rb +20 -0
  27. data/app/models/headers.rb +37 -0
  28. data/app/models/interesting_file.rb +30 -0
  29. data/app/models/robots_txt.rb +20 -0
  30. data/app/models/xml_rpc.rb +35 -0
  31. data/app/views/cli/core/finished.erb +4 -0
  32. data/app/views/cli/core/started.erb +3 -0
  33. data/app/views/cli/interesting_files/findings.erb +19 -0
  34. data/app/views/cli/scan_aborted.erb +4 -0
  35. data/app/views/json/core/finished.erb +3 -0
  36. data/app/views/json/core/started.erb +3 -0
  37. data/app/views/json/interesting_files/findings.erb +1 -0
  38. data/app/views/json/scan_aborted.erb +4 -0
  39. data/cms_scanner.gemspec +37 -0
  40. data/examples/views/cli/wp_custom/test.erb +1 -0
  41. data/examples/views/json/wp_custom/test.erb +1 -0
  42. data/examples/wpscan.rb +29 -0
  43. data/lib/cms_scanner.rb +71 -0
  44. data/lib/cms_scanner/browser.rb +68 -0
  45. data/lib/cms_scanner/browser/actions.rb +48 -0
  46. data/lib/cms_scanner/browser/options.rb +53 -0
  47. data/lib/cms_scanner/cache/file_store.rb +75 -0
  48. data/lib/cms_scanner/cache/typhoeus.rb +21 -0
  49. data/lib/cms_scanner/controller.rb +90 -0
  50. data/lib/cms_scanner/controllers.rb +34 -0
  51. data/lib/cms_scanner/errors/auth_errors.rb +15 -0
  52. data/lib/cms_scanner/finders.rb +5 -0
  53. data/lib/cms_scanner/finders/finder.rb +27 -0
  54. data/lib/cms_scanner/finders/finding.rb +32 -0
  55. data/lib/cms_scanner/finders/findings.rb +25 -0
  56. data/lib/cms_scanner/finders/independent_finder.rb +30 -0
  57. data/lib/cms_scanner/finders/independent_finders.rb +41 -0
  58. data/lib/cms_scanner/formatter.rb +118 -0
  59. data/lib/cms_scanner/formatter/buffer.rb +15 -0
  60. data/lib/cms_scanner/target.rb +33 -0
  61. data/lib/cms_scanner/target/platform.rb +2 -0
  62. data/lib/cms_scanner/target/platform/php.rb +39 -0
  63. data/lib/cms_scanner/target/platform/wordpress.rb +35 -0
  64. data/lib/cms_scanner/target/platform/wordpress/custom_directories.rb +62 -0
  65. data/lib/cms_scanner/target/server.rb +3 -0
  66. data/lib/cms_scanner/target/server/apache.rb +43 -0
  67. data/lib/cms_scanner/target/server/generic.rb +34 -0
  68. data/lib/cms_scanner/target/server/iis.rb +48 -0
  69. data/lib/cms_scanner/version.rb +4 -0
  70. data/lib/cms_scanner/web_site.rb +68 -0
  71. data/lib/helper.rb +24 -0
  72. data/spec/app/controllers/core_spec.rb +152 -0
  73. data/spec/app/controllers/interesting_files_spec.rb +50 -0
  74. data/spec/app/finders/interesting_files/fantastico_fileslist_spec.rb +68 -0
  75. data/spec/app/finders/interesting_files/headers_spec.rb +38 -0
  76. data/spec/app/finders/interesting_files/robots_txt_spec.rb +56 -0
  77. data/spec/app/finders/interesting_files/search_replace_db_2_spec.rb +55 -0
  78. data/spec/app/finders/interesting_files/xml_rpc_spec.rb +138 -0
  79. data/spec/app/finders/interesting_files_spec.rb +13 -0
  80. data/spec/app/formatters/cli_no_colour_spec.rb +17 -0
  81. data/spec/app/formatters/cli_spec.rb +21 -0
  82. data/spec/app/formatters/json_spec.rb +33 -0
  83. data/spec/app/models/fantastico_fileslist_spec.rb +32 -0
  84. data/spec/app/models/headers_spec.rb +52 -0
  85. data/spec/app/models/interesting_file_spec.rb +51 -0
  86. data/spec/app/models/robots_txt_spec.rb +28 -0
  87. data/spec/app/models/xml_rpc_spec.rb +47 -0
  88. data/spec/cache/.gitignore +4 -0
  89. data/spec/dummy_finders.rb +41 -0
  90. data/spec/fixtures/interesting_files/fantastico_fileslist/fantastico_fileslist.txt +12 -0
  91. data/spec/fixtures/interesting_files/file.txt +4 -0
  92. data/spec/fixtures/interesting_files/headers/interesting.txt +14 -0
  93. data/spec/fixtures/interesting_files/headers/no_interesting.txt +12 -0
  94. data/spec/fixtures/interesting_files/robots_txt/robots.txt +10 -0
  95. data/spec/fixtures/interesting_files/search_replace_db_2/searchreplacedb2.php +188 -0
  96. data/spec/fixtures/interesting_files/xml_rpc/homepage_in_scope_pingback.html +7 -0
  97. data/spec/fixtures/interesting_files/xml_rpc/homepage_out_of_scope_pingback.html +7 -0
  98. data/spec/fixtures/interesting_files/xml_rpc/xmlrpc.php +1 -0
  99. data/spec/fixtures/output.txt +0 -0
  100. data/spec/fixtures/target/platform/php/debug_log/debug.log +2 -0
  101. data/spec/fixtures/target/platform/php/fpd/wp_rss_functions.php +2 -0
  102. data/spec/fixtures/target/platform/wordpress/custom_directories/custom_w_spaces.html +10 -0
  103. data/spec/fixtures/target/platform/wordpress/custom_directories/default.html +14 -0
  104. data/spec/fixtures/target/platform/wordpress/custom_directories/https.html +12 -0
  105. data/spec/fixtures/target/platform/wordpress/detection/default.html +4 -0
  106. data/spec/fixtures/target/platform/wordpress/detection/not_wp.html +8 -0
  107. data/spec/fixtures/target/platform/wordpress/detection/wp_includes.html +3 -0
  108. data/spec/fixtures/target/server/apache/directory_listing/2.2.16.html +15 -0
  109. data/spec/fixtures/target/server/generic/server/apache/basic.txt +5 -0
  110. data/spec/fixtures/target/server/generic/server/iis/basic.txt +6 -0
  111. data/spec/fixtures/target/server/generic/server/not_detected.txt +3 -0
  112. data/spec/fixtures/target/server/iis/directory_listing/no_parent.html +3 -0
  113. data/spec/fixtures/target/server/iis/directory_listing/with_parent.html +3 -0
  114. data/spec/fixtures/views/base/ctrl/local.erb +1 -0
  115. data/spec/fixtures/views/base/ctrl/test.erb +3 -0
  116. data/spec/fixtures/views/base/global.erb +1 -0
  117. data/spec/fixtures/views/base/test.erb +2 -0
  118. data/spec/fixtures/views/based_format/test.erb +1 -0
  119. data/spec/fixtures/views/json/render_me.erb +4 -0
  120. data/spec/lib/browser_spec.rb +141 -0
  121. data/spec/lib/cache/file_store_spec.rb +101 -0
  122. data/spec/lib/cache/typhoeus_spec.rb +30 -0
  123. data/spec/lib/cms_scanner_spec.rb +45 -0
  124. data/spec/lib/controller_spec.rb +23 -0
  125. data/spec/lib/controllers_spec.rb +52 -0
  126. data/spec/lib/finders/findings_spec.rb +49 -0
  127. data/spec/lib/finders/independent_finders_spec.rb +98 -0
  128. data/spec/lib/formatter_spec.rb +136 -0
  129. data/spec/lib/sub_scanner_spec.rb +27 -0
  130. data/spec/lib/target/platforms_spec.rb +13 -0
  131. data/spec/lib/target/servers_spec.rb +13 -0
  132. data/spec/lib/target_spec.rb +50 -0
  133. data/spec/lib/web_site_spec.rb +124 -0
  134. data/spec/shared_examples.rb +11 -0
  135. data/spec/shared_examples/browser_actions.rb +32 -0
  136. data/spec/shared_examples/finding.rb +20 -0
  137. data/spec/shared_examples/formatter_buffer.rb +8 -0
  138. data/spec/shared_examples/formatter_class_methods.rb +26 -0
  139. data/spec/shared_examples/independent_finder.rb +33 -0
  140. data/spec/shared_examples/target/platform/php.rb +58 -0
  141. data/spec/shared_examples/target/platform/wordpress.rb +41 -0
  142. data/spec/shared_examples/target/platform/wordpress/custom_directories.rb +50 -0
  143. data/spec/shared_examples/target/server/apache.rb +33 -0
  144. data/spec/shared_examples/target/server/generic.rb +34 -0
  145. data/spec/shared_examples/target/server/iis.rb +38 -0
  146. data/spec/spec_helper.rb +41 -0
  147. metadata +432 -0
@@ -0,0 +1,15 @@
1
+ module CMSScanner
2
+ module Formatter
3
+ # CLI No Colour Formatter
4
+ class CliNoColour < Cli
5
+ # Override to get the cli views
6
+ def format
7
+ 'cli'
8
+ end
9
+
10
+ def colorize(text, _color_code)
11
+ text
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module CMSScanner
2
+ module Formatter
3
+ # JSON Formatter
4
+ class Json < Base
5
+ include Buffer
6
+
7
+ def beautify
8
+ puts JSON.pretty_generate(JSON.parse("{#{buffer.chomp.chomp(',')}}"))
9
+ end
10
+ end
11
+ end
12
+ end
data/app/models.rb ADDED
@@ -0,0 +1,5 @@
1
+ require_relative 'models/interesting_file'
2
+ require_relative 'models/robots_txt'
3
+ require_relative 'models/fantastico_fileslist'
4
+ require_relative 'models/headers'
5
+ require_relative 'models/xml_rpc'
@@ -0,0 +1,20 @@
1
+ module CMSScanner
2
+ # FantasticoFileslist
3
+ class FantasticoFileslist < InterestingFile
4
+ # @return [ Array<String> ] The interesting files/dirs detected
5
+ def interesting_entries
6
+ results = []
7
+
8
+ entries.each do |entry|
9
+ next unless entry =~ /(?:admin|\.log|\.sql|\.db)/i
10
+
11
+ results << entry
12
+ end
13
+ results
14
+ end
15
+
16
+ def references
17
+ %w(http://www.acunetix.com/vulnerabilities/fantastico-fileslist/)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,37 @@
1
+ module CMSScanner
2
+ # Not really an interesting file, but will use this class for convenience
3
+ class Headers < InterestingFile
4
+ # @return [ Hash ] The headers
5
+ def entries
6
+ res = NS::Browser.get(url)
7
+ return [] unless res && res.headers
8
+ res.headers
9
+ end
10
+
11
+ # @return [ Array<String> ] The interesting headers detected
12
+ def interesting_entries
13
+ results = []
14
+
15
+ entries.each do |header, value|
16
+ next if known_headers.include?(header.downcase)
17
+
18
+ results << "#{header}: #{value}"
19
+ end
20
+ results
21
+ end
22
+
23
+ # @return [ Array<String> ] Downcased known headers
24
+ def known_headers
25
+ %w(
26
+ age accept-ranges cache-control content-type content-length connection date etag expires
27
+ location last-modified link pragma set-cookie strict-transport-security transfer-encoding
28
+ vary x-cache x-content-security-policy x-content-type-options x-frame-options x-language
29
+ x-permitted-cross-domain-policies x-pingback x-varnish x-webkit-csp x-xss-protection
30
+ )
31
+ end
32
+
33
+ def eql?(other)
34
+ super(other) && interesting_entries == other.interesting_entries
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,30 @@
1
+ module CMSScanner
2
+ # Interesting File
3
+ class InterestingFile
4
+ include NS::Finders::Finding
5
+
6
+ attr_reader :url
7
+
8
+ def initialize(url, opts = {})
9
+ @url = url
10
+ parse_finding_options(opts)
11
+ end
12
+
13
+ # @return [ Array<String> ]
14
+ def entries
15
+ res = NS::Browser.get(url)
16
+
17
+ return [] unless res && res.headers['Content-Type'] =~ /\Atext\/plain;/i
18
+
19
+ res.body.split("\n").reject { |s| s.strip.empty? }
20
+ end
21
+
22
+ def ==(other)
23
+ url == other.url
24
+ end
25
+
26
+ def eql?(other)
27
+ url == other.url && confidence == other.confidence && found_by == other.found_by
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ module CMSScanner
2
+ # Robots.txt
3
+ class RobotsTxt < InterestingFile
4
+ # @todo Better detection, currently everythinh not empty or / is returned
5
+ #
6
+ # @return [ Array<String> ] The interesting Allow/Disallow rules detected
7
+ def interesting_entries
8
+ results = []
9
+
10
+ entries.each do |entry|
11
+ next unless entry =~ /\A(?:dis)?allow:\s*(.+)\z/i
12
+ match = Regexp.last_match(1)
13
+ next if match == '/'
14
+
15
+ results << match
16
+ end
17
+ results
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ module CMSScanner
2
+ # XML RPC
3
+ class XMLRPC < InterestingFile
4
+ # @param [ String ] method
5
+ # @param [ Array ] params
6
+ # @param [ Hash ] request_params
7
+ #
8
+ # @return [ Typhoeus::Response ]
9
+ def call(method, params = [], request_params = {})
10
+ NS::Browser.post(url, request_params.merge(body: request_body(method, params)))
11
+ end
12
+
13
+ # Might be better to use Nokogiri to create the XML body ?
14
+ #
15
+ # @param [ String ] method
16
+ # @param [ Array ] params
17
+ #
18
+ # @return [ String ] The body of the XML RPC request
19
+ def request_body(method, params = [])
20
+ p_body = ''
21
+
22
+ params.each { |p| p_body << "<param><value><string>#{p}</string></value></param>" }
23
+
24
+ body = '<?xml version="1.0"?><methodCall>'
25
+ body << "<methodName>#{method}</methodName>"
26
+ body << "<params>#{p_body}</params>" unless p_body.length == 0
27
+ body << '</methodCall>'
28
+ end
29
+
30
+ # Use the system.listMethods to get the list of available methods ?
31
+ # def entries
32
+ #
33
+ # end
34
+ end
35
+ end
@@ -0,0 +1,4 @@
1
+
2
+ <%= green('[+]') %> Finished: <%= @stop_time.asctime %>
3
+ <%= green('[+]') %> Memory used: <%= @used_memory.bytes_to_human %>
4
+ <%= green('[+]') %> Elapsed time: <%= Time.at(@elapsed).utc.strftime('%H:%M:%S') %>
@@ -0,0 +1,3 @@
1
+ <%= green('[+]') %> URL: <%= @url %>
2
+ <%= green('[+]') %> Started: <%= @start_time.asctime %>
3
+
@@ -0,0 +1,19 @@
1
+ Interesting Findings: <%= @findings.size %>
2
+
3
+ <% @findings.each do |finding| -%>
4
+ [+] <%= finding.url %>
5
+ | Confidence: <%= finding.confidence %>%
6
+ | Found By: <%= finding.found_by %>
7
+ <% unless (confirmed = finding.confirmed_by).empty? -%>
8
+ | Confirmed By:
9
+ <% confirmed.each do |c| -%>
10
+ | - <%= c.found_by %>, <%= c.confidence %>% confidence
11
+ <% end -%>
12
+ <% end -%>
13
+ <% unless (entries = finding.interesting_entries).empty? -%>
14
+ | Interesting Entries:
15
+ <% entries.each do |entry| -%>
16
+ | - <%= entry %>
17
+ <% end -%>
18
+ <% end %>
19
+ <% end %>
@@ -0,0 +1,4 @@
1
+ Scan Aborted: <%= @reason %>
2
+ <% if @verbose -%>
3
+ Trace: <%= @trace.join("\n") %>
4
+ <% end %>
@@ -0,0 +1,3 @@
1
+ "stop_time": <%= @stop_time.to_i %>,
2
+ "elapsed": <%= @elapsed %>,
3
+ "used_memory": <%= @used_memory %>,
@@ -0,0 +1,3 @@
1
+ "start_time": <%= @start_time.to_i %>,
2
+ "start_memory": <%= @start_memory %>,
3
+ "target_url": "<%= @url %>",
@@ -0,0 +1 @@
1
+ "todo": "Not yet done",
@@ -0,0 +1,4 @@
1
+ "scan_aborted": "<%= @reason %>",
2
+ <% if @verbose -%>
3
+ "trace": <%= @trace %>,
4
+ <% end %>
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'cms_scanner/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'cms_scanner'
9
+ s.version = CMSScanner::VERSION
10
+ s.platform = Gem::Platform::RUBY
11
+ s.required_ruby_version = '>= 2.0.0'
12
+ s.authors = ['WPScanTeam - Erwan le Rousseau']
13
+ s.email = ['erwan.lr@gmail.com']
14
+ s.summary = 'Experimental CMSScanner'
15
+ s.description = 'Experimental CMSScanner'
16
+ s.homepage = 'https://github.com/wpscanteam/CMSScanner'
17
+ s.license = 'MIT'
18
+
19
+ s.files = `git ls-files -z`.split("\x0")
20
+ s.executables = s.files.grep(/^bin\//) { |f| File.basename(f) }
21
+ s.test_files = s.files.grep(/^(test|spec|features)\//)
22
+ s.require_path = 'lib'
23
+
24
+ s.add_dependency 'opt_parse_validator', '~> 0.0.2'
25
+ s.add_dependency 'typhoeus'
26
+ s.add_dependency 'nokogiri'
27
+ s.add_dependency 'addressable'
28
+ s.add_dependency 'activesupport'
29
+
30
+ s.add_development_dependency 'rake'
31
+ s.add_development_dependency 'rspec', '~> 3.1'
32
+ s.add_development_dependency 'rspec-its'
33
+ s.add_development_dependency 'bundler', '~> 1.6'
34
+ s.add_development_dependency 'rubocop', '~> 0.26'
35
+ s.add_development_dependency 'webmock', '>= 1.18'
36
+ s.add_development_dependency 'simplecov', '~> 0.9'
37
+ end
@@ -0,0 +1 @@
1
+ Testing! --wpscan-option = <%= @option %>
@@ -0,0 +1 @@
1
+ "--wpscan-option": <%= @option.to_json %>,
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'cms_scanner'
4
+
5
+ # Custom WPScan Scanner
6
+ module WPScan
7
+ include CMSScanner
8
+
9
+ module Controller
10
+ # Custom WPScan Controller
11
+ class WpCustom < CMSScanner::Controller::Base
12
+ def cli_options
13
+ [
14
+ OptString.new(['--wpscan-option VALUE'])
15
+ ]
16
+ end
17
+
18
+ def run
19
+ output('test', option: parsed_options[:wpscan_option])
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ WPScan::Scan.new do |s|
26
+ s.controllers << WPScan::Controller::WpCustom.new
27
+ s.views_directories << Pathname.new(__FILE__).dirname.join('views').to_s
28
+ s.run
29
+ end
@@ -0,0 +1,71 @@
1
+ # Gems
2
+ require 'opt_parse_validator'
3
+ require 'typhoeus'
4
+ require 'nokogiri'
5
+ require 'active_support/inflector'
6
+ require 'addressable/uri'
7
+ # Standard Libs
8
+ require 'erb'
9
+ require 'fileutils'
10
+ require 'pathname'
11
+ # Custom Libs
12
+ require 'helper'
13
+ require 'cms_scanner/errors/auth_errors'
14
+ require 'cms_scanner/cache/typhoeus'
15
+ require 'cms_scanner/target'
16
+ require 'cms_scanner/browser'
17
+ require 'cms_scanner/version'
18
+ require 'cms_scanner/controller'
19
+ require 'cms_scanner/controllers'
20
+ require 'cms_scanner/formatter'
21
+ require 'cms_scanner/finders'
22
+
23
+ # Module
24
+ module CMSScanner
25
+ APP_DIR = Pathname.new(__FILE__).dirname.join('..', 'app').expand_path
26
+ NS = self
27
+
28
+ def self.included(base)
29
+ remove_const(:NS)
30
+ const_set(:NS, base)
31
+ super(base)
32
+ end
33
+
34
+ # Scan
35
+ class Scan
36
+ def initialize
37
+ controllers << NS::Controller::Core.new
38
+
39
+ yield self if block_given?
40
+ end
41
+
42
+ # @return [ Controllers ]
43
+ def controllers
44
+ @controllers ||= NS::Controllers.new
45
+ end
46
+
47
+ def run
48
+ controllers.run
49
+ rescue => e
50
+ formatter.output('@scan_aborted',
51
+ reason: e.message,
52
+ trace: e.backtrace,
53
+ verbose: controllers.first.parsed_options[:verbose])
54
+ ensure
55
+ formatter.beautify
56
+ end
57
+
58
+ # Used for convenience
59
+ # @See Formatter
60
+ def formatter
61
+ controllers.first.formatter
62
+ end
63
+
64
+ # @return [ Hash ]
65
+ def datastore
66
+ controllers.first.datastore
67
+ end
68
+ end
69
+ end
70
+
71
+ require "#{CMSScanner::APP_DIR}/app"
@@ -0,0 +1,68 @@
1
+ require 'cms_scanner/browser/actions'
2
+ require 'cms_scanner/browser/options'
3
+
4
+ module CMSScanner
5
+ # Singleton used to perform HTTP/HTTPS request to the target
6
+ class Browser
7
+ extend Actions
8
+
9
+ # @param [ Hash ] parsed_options
10
+ #
11
+ # @return [ Void ]
12
+ def initialize(parsed_options = {})
13
+ load_options(parsed_options)
14
+ end
15
+
16
+ private_class_method :new
17
+
18
+ # @param [ Hash ] parsed_options
19
+ #
20
+ # @return [ Browser ] The instance
21
+ def self.instance(parsed_options = {})
22
+ @@instance ||= new(parsed_options)
23
+ end
24
+
25
+ def self.reset
26
+ @@instance = nil
27
+ end
28
+
29
+ # @param [ String ] url
30
+ # @param [ Hash ] params
31
+ #
32
+ # @return [ Typhoeus::Request ]
33
+ def forge_request(url, params = {})
34
+ Typhoeus::Request.new(url, request_params(params))
35
+ end
36
+
37
+ # @return [ Hash ]
38
+ def default_request_params
39
+ params = {
40
+ ssl_verifypeer: false, # Disable SSL-Certificate checks
41
+ ssl_verifyhost: 2, # Disable SSL-Certificate checks
42
+ headers: { 'User-Agent' => user_agent }
43
+ }
44
+
45
+ { connecttimeout: :connect_timeout, cache_ttl: :cache_ttl,
46
+ proxy: :proxy, timeout: :request_timeout, cookiejar: :cookie_jar,
47
+ cookiefile: :cookie_jar, cookie: :cookie_string
48
+ }.each do |typhoeus_opt, browser_opt|
49
+ attr_value = public_send(browser_opt)
50
+ params[typhoeus_opt] = attr_value unless attr_value.nil?
51
+ end
52
+
53
+ params[:proxyauth] = "#{proxy_auth[:username]}:#{proxy_auth[:password]}" if proxy_auth
54
+ params[:userpwd] = "#{http_auth[:username]}:#{http_auth[:password]}" if http_auth
55
+
56
+ params
57
+ end
58
+
59
+ # @param [ Hash ] params
60
+ #
61
+ # @return [ Hash ]
62
+ def request_params(params = {})
63
+ default_request_params.merge(params) do |key, oldval, newval|
64
+ key == :headers ? oldval.merge(newval) : newval
65
+ end
66
+ end
67
+ end
68
+ end