module AuthTrail

Constants

VERSION

Attributes

exclude_method[RW]
geocode[RW]
identity_method[RW]
job_queue[RW]
track_method[RW]
transform_method[RW]

Public Class Methods

safely(default: nil) { || ... } click to toggle source
# File lib/authtrail.rb, line 61
def self.safely(default: nil)
  begin
    yield
  rescue => e
    warn "[authtrail] #{e.class.name}: #{e.message}"
    default
  end
end
track(strategy:, scope:, identity:, success:, request:, user: nil, failure_reason: nil) click to toggle source
# File lib/authtrail.rb, line 23
def self.track(strategy:, scope:, identity:, success:, request:, user: nil, failure_reason: nil)
  data = {
    strategy: strategy,
    scope: scope,
    identity: identity,
    success: success,
    failure_reason: failure_reason,
    user: user,
    ip: request.remote_ip,
    user_agent: request.user_agent,
    referrer: request.referrer
  }

  if request.params[:controller]
    data[:context] = "#{request.params[:controller]}##{request.params[:action]}"
  end

  # add request data before exclude_method since exclude_method doesn't have access to request
  # could also add 2nd argument to exclude_method when arity > 1
  AuthTrail.transform_method.call(data, request) if AuthTrail.transform_method

  # if exclude_method throws an exception, default to not excluding
  exclude = AuthTrail.exclude_method && AuthTrail.safely(default: false) { AuthTrail.exclude_method.call(data) }

  unless exclude
    if AuthTrail.track_method
      AuthTrail.track_method.call(data)
    else
      login_activity = LoginActivity.new
      data.each do |k, v|
        login_activity.try("#{k}=", v)
      end
      login_activity.save!
      AuthTrail::GeocodeJob.perform_later(login_activity) if AuthTrail.geocode
    end
  end
end