# encoding: utf-8 module ProxyPacRb # Environment in which a proxy.pac will be evaluated class Environment private attr_reader :days, :months, :client_ip, :time, :io, :javascript_function_templates, :dns_timeout public attr_reader :available_methods def initialize(options = {}) @dns_timeout = 1 @days = { 'MON' => 1, 'TUE' => 2, 'WED' => 3, 'THU' => 4, 'FRI' => 5, 'SAT' => 6, 'SUN' => 0 } @months = { 'JAN' => 1, 'FEB' => 2, 'MAR' => 3, 'APR' => 4, 'MAY' => 5, 'JUN' => 6, 'JUL' => 7, 'AUG' => 8, 'SEP' => 9, 'OCT' => 10, 'NOV' => 11, 'DEC' => 12 } @client_ip = IPAddr.new(options.fetch(:client_ip, '127.0.0.1').to_s).to_s @time = Time.parse(options.fetch(:time, Time.now).to_s).to_s @io = options.fetch(:io, $stderr) @javascript_function_templates = ProxyPacJs @available_methods = [ :alert, :isPlainHostName, :dnsDomainIs, :localHostOrDomainIs, :isResolvable, :isInNet, :dnsResolve, :dnsDomainLevels, :shExpMatch ] end def alert(msg) io.puts msg end def isPlainHostName(host) !host.include? '.' end def dnsDomainIs(host, domain) host.end_with? domain end def localHostOrDomainIs(host, hostdom) host == hostdom || hostdom.include?(host) end def isResolvable(host) !resolve_host(host).blank? end def isInNet(host, base_ip, mask) raise ArgumentError, " needs to be defined" if base_ip.nil? || base_ip.empty? raise ArgumentError, " needs to be defined" if mask.nil? || mask.empty? IPAddr.new(base_ip).mask(mask).include? resolve_host(host) end def dnsResolve(host) resolve_host(host) end def dnsDomainLevels(host) host.scan('.').size end def shExpMatch(str, shexp) ::File.fnmatch(shexp, str) end private def resolve_host(host) return nil if host.blank? Timeout.timeout(dns_timeout) do Resolv.each_address(host.force_encoding('ASCII-8BIT')) do |address| begin return address if IPAddr.new(address).ipv4? # rubocop:disable Lint/HandleExceptions rescue ArgumentError end # rubocop:enable Lint/HandleExceptions end end # We couldn't find an IPv4 address for the host nil rescue Resolv::ResolvError, NoMethodError, Timeout::Error # Have to rescue NoMethodError because jruby has a bug with non existant hostnames # See http://jira.codehaus.org/browse/JRUBY-6054 nil end public def prepare(string) if client_ip string << "\n\n" string << javascript_function_templates.my_ip_address_template(client_ip) end if time string << javascript_function_templates.time_variables string << "\n\n" string << javascript_function_templates.week_day_range_template(time) string << "\n\n" string << javascript_function_templates.week_day_range_template(time) string << "\n\n" string << javascript_function_templates.date_range_template(time) string << "\n\n" string << javascript_function_templates.time_range_template(time) end string end end end