Module: Honeypot

Defined in:
lib/honeypot/rack.rb,
lib/honeypot.rb,
lib/honeypot/railtie.rb

Overview

Defined Under Namespace

Classes: Rack, Railtie

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



20
21
22
23
24
25
# File 'lib/honeypot.rb', line 20

def self.included(base)
  base.class_eval do
    has_many :remote_requests, :as => :requestable, :dependent => :destroy
    has_many :remote_hosts, :through => :remote_requests, :uniq => true
  end
end

Instance Method Details

#log_remote_request(request) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/honeypot.rb', line 27

def log_remote_request(request)
  effective_ip_address = [
    request.env['rack.session']['honeypot.last_known_remote_ip'].to_s,
    request.remote_ip.to_s
  ].detect(&:present?)
  remote_host = RemoteHost.find_or_create_by_ip_address effective_ip_address
  remote_request = remote_requests.find_or_create_by_remote_host_id remote_host.id
  remote_request.last_http_referer = request.referer if request.referer.present?
  remote_request.last_request_uri = request.url if request.url.present?
  remote_request.increment :hits
  remote_request.save!
  true
end


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/honeypot.rb', line 41

def related_requestables(seen_remote_host_ids = [])
  set = Set.new
  conditions = seen_remote_host_ids.present? ? [ "remote_hosts.id NOT IN (?)", seen_remote_host_ids ] : nil
  remote_hosts.where(conditions).find_in_batches do |batch|
    batch.each do |remote_host|
      seen_remote_host_ids << remote_host.id
      remote_host.remote_requests.all(:include => :requestable).each do |remote_request|
        set << remote_request.requestable
      end
    end
  end
  if respond_to?(:actor) and actor != self
    set += actor.related_requestables(seen_remote_host_ids)
  end
  set.delete self
  set
end