module Devise::Models::RevocableSession

Public Instance Methods

activate_session(request) click to toggle source

session

# File lib/devise_revocable_session/models/revocable_session.rb, line 18
def activate_session(request)
  new_session = revocable_sessions.new(attrs_for_login(request))
  new_session.session_id = SecureRandom.hex(64)
  new_session.device_id  = SecureRandom.uuid
  new_session.signed_in_ip = request.remote_ip
  new_session.save
  purge_old_sessions
  new_session
end
deactivate_session!(session_id) click to toggle source
# File lib/devise_revocable_session/models/revocable_session.rb, line 36
def deactivate_session!(session_id)
  devise_writer_wrapper do
    revocable_sessions.where(session_id: session_id).delete_all
  end
end
devise_writer_wrapper() { || ... } click to toggle source
# File lib/devise_revocable_session/models/revocable_session.rb, line 58
def devise_writer_wrapper
  role = Rails.application.config.active_record.writing_role || :writing
  ActiveRecord::Base.connected_to(role: role) do
    ActiveRecord::Base.connection_handler.while_preventing_writes(false) do
      yield
    end
  end
end
exclusive_session(session_id) click to toggle source
# File lib/devise_revocable_session/models/revocable_session.rb, line 28
def exclusive_session(session_id)
  revocable_sessions.where('session_id != ?', session_id).delete_all
end
has_revocable_sessions?() click to toggle source
# File lib/devise_revocable_session/models/revocable_session.rb, line 13
def has_revocable_sessions?
  true
end
mark_last_seen!(device_id) click to toggle source
# File lib/devise_revocable_session/models/revocable_session.rb, line 48
def mark_last_seen!(device_id)
  devise_writer_wrapper do
    login_record = revocable_sessions.find_by(device_id: device_id)
    #skip second to reduce database hit
    if (Time.now - (login_record.last_seen_at)) >= 60
      login_record.update_column :last_seen_at, Time.now
    end
  end
end
purge_old_sessions() click to toggle source
# File lib/devise_revocable_session/models/revocable_session.rb, line 42
def purge_old_sessions
  devise_writer_wrapper do
    revocable_sessions.order(last_seen_at: :desc).offset(10).destroy_all
  end
end
session_active?(device_id, session_id) click to toggle source
# File lib/devise_revocable_session/models/revocable_session.rb, line 32
def session_active?(device_id, session_id)
  revocable_sessions.where(device_id: device_id, session_id: session_id).exists?
end

Protected Instance Methods

attrs_for_login(request) click to toggle source
# File lib/devise_revocable_session/models/revocable_session.rb, line 69
def attrs_for_login(request)
  t = Time.now
  { user_agent: request.user_agent,
    last_seen_ip: request.remote_ip,
    signed_in_at: t,
    last_seen_at: t }
end