require 'custodian/settings'
require 'custodian/testfactory'
require 'uri'
#
# The open-proxy test.
#
# This object is instantiated if the parser sees a line such as:
#
###
### foo.vm.bytemark.co.uk must not run openproxy otherwise 'insecurity'.
###
#
#
module Custodian
module ProtocolTest
class OpenProxyTest < TestFactory
#
# The line from which we were constructed.
#
attr_reader :line
#
# Constructor
#
def initialize(line)
#
# Save the line
#
@line = line
#
# Save the target
#
@host = line.split(/\s+/)[0]
end
#
# Allow this test to be serialized.
#
def to_s
@line
end
#
# Run the test.
#
def run_test
# Reset state, in case we've previously run.
@error = nil
begin
require 'rubygems'
require 'curb'
rescue LoadError
@error = "The required rubygem 'curb' was not found."
return false
end
#
# Get the timeout period for this test.
#
settings = Custodian::Settings.instance
period = settings.timeout
begin
timeout(period) do
begin
c = Curl::Easy.new
c.follow_location = true
c.max_redirects = 10
c.ssl_verify_host = false
c.proxy_url = @host
c.proxy_tunnel = true
c.url = 'http://google.com/'
c.ssl_verify_peer = false
c.timeout = period
c.perform
@status = c.response_code
@content = c.body_str
rescue Curl::Err::SSLCACertificateError => x
@error = 'SSL-Validation error'
return false
rescue Curl::Err::TimeoutError
@error = 'Timed out fetching page.'
return false
rescue Curl::Err::TooManyRedirectsError
@error = 'Too many redirections (more than 10)'
return false
rescue => x
@error = "Exception: #{x}"
return false
end
end
rescue Timeout::Error => _e
@error = 'Timed out during fetch.'
return Custodian::TestResult::TEST_FAILED
end
#
# A this point we've either had an exception, or we've
# got a result.
#
if (@status.to_i == 200)
return Custodian::TestResult::TEST_PASSED
else
@error = "Proxy fetch of http://google.com/ via #{@host} failed"
return Custodian::TestResult::TEST_FAILED
end
end
#
# If the test fails then report the error.
#
def error
@error
end
register_test_type 'openproxy'
end
end
end