module Detrusion

Public Instance Methods

detrusion_analyze() click to toggle source
# File lib/detrusion.rb, line 36
def detrusion_analyze
  ip = request.remote_addr
  
  # check whitelist
  return false if @@detrusion_config[:white_list].include?(ip)
  
  # check blacklist
  is_blocked = false
  if @@detrusion_config[:black_list]
    @@detrusion_config[:black_list].each do |blacklisted|
      if blacklisted[:ip] == ip
        is_blocked = blacklisted[:score] >= @@detrusion_config[:block_score]
        break
      end
      
    end
    
  end
  return true if is_blocked
  
  detrusion_report if detrusion_recursive_check(params)
  return is_blocked
end
detrusion_check() click to toggle source

called from the before_filter of the application controller

# File lib/detrusion.rb, line 18
def detrusion_check
  return true unless defined?(DETRUSION_CONFIG)
  
  if @@detrusion_config[:last_sync] == nil or @@detrusion_config[:last_sync] + @@detrusion_config[:sync_interval] < Time.now
    @@detrusion_config[:synced] = false
  end
       
  # sync if required
  detrusion_sync unless @@detrusion_config[:synced]
  
  # analyze and redirect if necessary
  redirect_to @@detrusion_config[:redirect] and return if detrusion_analyze
  
rescue
  return true
end
detrusion_get_https() click to toggle source
# File lib/detrusion.rb, line 73
def detrusion_get_https
  # set defaults
  host = DETRUSION_CONFIG[:host] ? DETRUSION_CONFIG[:host] : 'detrusion.com'
  port = DETRUSION_CONFIG[:port] ? DETRUSION_CONFIG[:port] : 443
  ssl  = DETRUSION_CONFIG[:ssl] != nil ? DETRUSION_CONFIG[:ssl] : true
  
  https = Net::HTTP.new(host, port)
  https.use_ssl = ssl
  https.verify_mode = OpenSSL::SSL::VERIFY_NONE
  return https
end
detrusion_recursive_check(value) click to toggle source
# File lib/detrusion.rb, line 60
def detrusion_recursive_check(value)
  if value.class == ActiveSupport::HashWithIndifferentAccess
    value.each_value do |subvalue|
      return true if detrusion_recursive_check(subvalue)
    end
  else
    @@detrusion_config[:patterns].each do |pattern|
      return true if pattern.match(value)
    end  
  end
  return false
end
detrusion_report() click to toggle source
# File lib/detrusion.rb, line 85
def detrusion_report
  https = detrusion_get_https
  success = false

  #response = nil
  https.start { |connection|
      req = Net::HTTP::Post.new('/api/report')
      req.set_form_data({
                      'email' => DETRUSION_CONFIG[:user],
                      'api' => DETRUSION_CONFIG[:api],
                      'ip' => request.remote_addr,
                      'url' => request.url
      })
      resp, dat = connection.request(req)         
      success = resp.body == 'OK'
      @@detrusion_config[:synced] = false if success # force resync
    }
  return success
end
detrusion_sync() click to toggle source
# File lib/detrusion.rb, line 106
def detrusion_sync
  https = detrusion_get_https

  response = nil
  https.start { |connection|
    req = Net::HTTP::Post.new('/api/sync')
      req.set_form_data({
                      'email' => DETRUSION_CONFIG[:user],
                      'api' => DETRUSION_CONFIG[:api],
                      'url' => request.url
    })
      resp, dat = connection.request(req)           
      response = YAML::load(resp.body)    
  }
  
  #puts response.to_yaml

  # save results in memory
  @@detrusion_config[:white_list] = response[:whitelist]
  @@detrusion_config[:black_list] = response[:blacklist]
  @@detrusion_config[:sync_interval] = response[:sync_interval]
  @@detrusion_config[:block_score] = response[:block_score]
  @@detrusion_config[:redirect] = response[:redirect]
  @@detrusion_config[:patterns] = response[:patterns]
  
  @@detrusion_config[:synced] = true
  @@detrusion_config[:last_sync] = Time.now
  return true
rescue
  return false
end