Sha256: 4f9c071f93cd7a3aa628818e06d4f119bfd8d80ae6875446214f784711fb0152

Contents?: true

Size: 1.61 KB

Versions: 19

Compression:

Stored size: 1.61 KB

Contents

# frozen_string_literal: true

require 'resolv'
require 'ipaddr'

module Legitbot
  module Validators
    #
    # In a bot matcher:
    # `domains 'search.msn.com', ...`
    # `domains 'googlebot.com', reverse: false`
    #
    # `reverse` is true by default.
    module Domains
      class << self
        def included(base)
          base.extend ClassMethods
        end
      end

      def valid_domain?
        self.class.valid_domain?(@ip)
      end

      module ClassMethods # :nodoc:
        include Legitbot::Config::Resolver

        def domains(*list, reverse: true)
          @valid_domains = list.flatten.map { |d| Resolv::DNS::Name.create(d) }
          @validate_reverse_record = reverse
        end

        def check_domains?
          instance_variable_defined?(:@valid_domains)
        end

        def valid_domain?(ip)
          return true unless check_domains?
          return true if @valid_domains.empty?

          domains = reverse_domains(ip)
          return false if domains.empty?

          record = find_subdomain_record(domains)
          return false unless record
          return true unless @validate_reverse_record

          ip == reverse_ip(record)
        end

        def reverse_domains(ip)
          resolver.getnames(ip)
        rescue Resolv::ResolvError
          nil
        end

        def find_subdomain_record(domains)
          domains.find do |d|
            @valid_domains.any? { |vd| d.subdomain_of?(vd) }
          end
        end

        def reverse_ip(record)
          return nil if record.nil?

          resolver.getaddress(record.to_s).to_s
        end
      end
    end
  end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
legitbot-1.5.1 lib/legitbot/validators/domains.rb
legitbot-1.5.0 lib/legitbot/validators/domains.rb
legitbot-1.4.5 lib/legitbot/validators/domains.rb
legitbot-1.4.4 lib/legitbot/validators/domains.rb
legitbot-1.4.3 lib/legitbot/validators/domains.rb
legitbot-1.4.2 lib/legitbot/validators/domains.rb
legitbot-1.4.1 lib/legitbot/validators/domains.rb
legitbot-1.4.0 lib/legitbot/validators/domains.rb
legitbot-1.3.0 lib/legitbot/validators/domains.rb
legitbot-1.2.0 lib/legitbot/validators/domains.rb
legitbot-1.1.1 lib/legitbot/validators/domains.rb
legitbot-1.1.0 lib/legitbot/validators/domains.rb
legitbot-1.0.2 lib/legitbot/validators/domains.rb
legitbot-1.0.1 lib/legitbot/validators/domains.rb
legitbot-1.0.0 lib/legitbot/validators/domains.rb
legitbot-0.4.3 lib/legitbot/validators/domains.rb
legitbot-0.4.2 lib/legitbot/validators/domains.rb
legitbot-0.4.1 lib/legitbot/validators/domains.rb
legitbot-0.4.0 lib/legitbot/validators/domains.rb