Sha256: 14ee19750d009e0dd0ca146a2dd7f41ac4081673fef2e97ca6351c5ef759bb66

Contents?: true

Size: 1.18 KB

Versions: 8

Compression:

Stored size: 1.18 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

    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

8 entries across 8 versions & 1 rubygems

Version Path
quo_vadis-2.1.4 app/models/quo_vadis/session.rb
quo_vadis-2.1.3 app/models/quo_vadis/session.rb
quo_vadis-2.1.2 app/models/quo_vadis/session.rb
quo_vadis-2.1.1 app/models/quo_vadis/session.rb
quo_vadis-2.1.0 app/models/quo_vadis/session.rb
quo_vadis-2.0.2 app/models/quo_vadis/session.rb
quo_vadis-2.0.1 app/models/quo_vadis/session.rb
quo_vadis-2.0.0 app/models/quo_vadis/session.rb