Class: Veri::Session
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Veri::Session
- Defined in:
- lib/veri/models/session.rb
Class Method Summary collapse
- .establish(user, request, resolved_tenant) ⇒ Object
- .find_active(token, resolved_tenant) ⇒ Object
- .prune ⇒ Object
Instance Method Summary collapse
- #active? ⇒ Boolean
- #expired? ⇒ Boolean
- #identity ⇒ Object
- #inactive? ⇒ Boolean
- #info ⇒ Object
- #original_tenant ⇒ Object
- #shapeshift(user, tenant: nil) ⇒ Object
- #shapeshifted? ⇒ Boolean
- #tenant ⇒ Object
- #to_true_identity ⇒ Object
- #true_identity ⇒ Object
- #true_tenant ⇒ Object
- #update_info(request) ⇒ Object
Class Method Details
.establish(user, request, resolved_tenant) ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/veri/models/session.rb', line 103 def establish(user, request, resolved_tenant) token = SecureRandom.hex(32) expires_at = Time.current + Veri::Configuration.total_session_lifetime new( hashed_token: digest_token(token), expires_at:, authenticatable: user, **resolved_tenant ).update_info(request) token end |
.find_active(token, resolved_tenant) ⇒ Object
129 130 131 132 133 134 135 |
# File 'lib/veri/models/session.rb', line 129 def find_active(token, resolved_tenant) return nil if token.blank? session = find_by(hashed_token: digest_token(token), **resolved_tenant) session&.active? ? session : nil end |
.prune ⇒ Object
117 118 119 120 121 122 123 124 125 |
# File 'lib/veri/models/session.rb', line 117 def prune orphaned_tenant_sessions = where.not(tenant_id: nil).includes(:tenant).filter_map do |session| !session.tenant rescue ActiveRecord::RecordNotFound session.id end where(id: orphaned_tenant_sessions).delete_all if orphaned_tenant_sessions.any? end |
Instance Method Details
#active? ⇒ Boolean
19 |
# File 'lib/veri/models/session.rb', line 19 def active? = !expired? && !inactive? |
#expired? ⇒ Boolean
21 22 23 |
# File 'lib/veri/models/session.rb', line 21 def expired? expires_at < Time.current end |
#identity ⇒ Object
55 |
# File 'lib/veri/models/session.rb', line 55 def identity = authenticatable |
#inactive? ⇒ Boolean
25 26 27 28 29 30 31 |
# File 'lib/veri/models/session.rb', line 25 def inactive? inactive_session_lifetime = Veri::Configuration.inactive_session_lifetime return false unless inactive_session_lifetime last_seen_at < Time.current - inactive_session_lifetime end |
#info ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/veri/models/session.rb', line 43 def info agent = UserAgentParser.parse(user_agent) { device: agent.device.to_s, os: agent.os.to_s, browser: agent.to_s, ip_address:, last_seen_at: } end |
#original_tenant ⇒ Object
98 99 100 |
# File 'lib/veri/models/session.rb', line 98 def original_tenant resolve_tenant(original_tenant_type, original_tenant_id) { super } end |
#shapeshift(user, tenant: nil) ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/veri/models/session.rb', line 60 def shapeshift(user, tenant: nil) raise Veri::Error, "Cannot shapeshift from a shapeshifted session" if shapeshifted? resolved_tenant = Veri::Inputs::Tenant.new( tenant, error: Veri::InvalidTenantError, message: "Expected a string, an ActiveRecord model instance, or nil, got `#{tenant.inspect}`" ).resolve update!( shapeshifted_at: Time.current, original_authenticatable: authenticatable, original_tenant_type: tenant_type, original_tenant_id: tenant_id, **resolved_tenant, authenticatable: Veri::Inputs::Authenticatable.new( user, message: "Expected an instance of #{Veri::Configuration.user_model_name}, got `#{user.inspect}`" ).process ) end |
#shapeshifted? ⇒ Boolean
56 |
# File 'lib/veri/models/session.rb', line 56 def shapeshifted? = original_authenticatable.present? |
#tenant ⇒ Object
94 95 96 |
# File 'lib/veri/models/session.rb', line 94 def tenant resolve_tenant(tenant_type, tenant_id) { super } end |
#to_true_identity ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/veri/models/session.rb', line 82 def to_true_identity update!( shapeshifted_at: nil, authenticatable: original_authenticatable, tenant_type: original_tenant_type, tenant_id: original_tenant_id, original_tenant_type: nil, original_tenant_id: nil, original_authenticatable: nil ) end |
#true_identity ⇒ Object
57 |
# File 'lib/veri/models/session.rb', line 57 def true_identity = original_authenticatable || authenticatable |
#true_tenant ⇒ Object
58 |
# File 'lib/veri/models/session.rb', line 58 def true_tenant = original_tenant || tenant |
#update_info(request) ⇒ Object
35 36 37 38 39 40 41 |
# File 'lib/veri/models/session.rb', line 35 def update_info(request) update!( last_seen_at: Time.current, ip_address: request.remote_ip, user_agent: request.user_agent ) end |