Sha256: cbdb6f50310e19f25e655749ad12ad2300d15b336d860cf04c96b7f3596e4c14

Contents?: true

Size: 1.23 KB

Versions: 1

Compression:

Stored size: 1.23 KB

Contents

# frozen_string_literal: true

module QuoVadis

  # A session is started once a user logs in with a password,
  # regardless of whether 2FA is also required.
  class Session < ActiveRecord::Base
    include IpMasking

    belongs_to :account
    validates :ip, presence: true
    scope :new_to_old, -> { order create_at: :desc }

    attribute :last_seen_at, :datetime, default: -> { Time.now.utc }

    def logout_other_sessions
      account.sessions.reject { |s| s == self }.each &:destroy
    end

    def authenticated_with_second_factor
      touch :second_factor_at
    end

    def reset_authenticated_with_second_factor
      update second_factor_at: nil
    end

    def second_factor_authenticated?
      !second_factor_at.nil?
    end

    def expired?
      exceeded_lifetime? || exceeded_idle_timeout?
    end

    def replace
      destroy.dup.tap &:save
    end

    private

    def exceeded_lifetime?
      return false if browser_session?
      lifetime_expires_at < Time.now.utc
    end

    def browser_session?
      lifetime_expires_at.nil?
    end

    def exceeded_idle_timeout?
      return false if QuoVadis.session_idle_timeout == :lifetime
      QuoVadis.session_idle_timeout.since(last_seen_at) < Time.now.utc
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
quo_vadis-2.1.5 app/models/quo_vadis/session.rb