katalyst-koi 5.5.0 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9a64f8ea56e122d169ec52b8c304c79a1b81289bba216d89d2b97c9f0aaf9e24
4
- data.tar.gz: e07ac3a269c0cf2958f33fb9e3da25dec86a84d27f25f3d0314ecc4d4fed5f4f
3
+ metadata.gz: beb8b89b9542bb29583d8908cbc41746eaa2eaac7540ebd0c1ba0f7818e2a524
4
+ data.tar.gz: 0f80f33a3561c9913540115cff337c5df17ca50789435973ad1b1df11438cbf8
5
5
  SHA512:
6
- metadata.gz: c337a6f84e5ce47739dc9242207b9eafd2a0fbf6c9bf3f5b89338910175b3598dc575037849fb1a844e1a1608b54cb9e08e891286047b1548bbe127484ae446a
7
- data.tar.gz: 84b32b36bd70147f24f0b975df0b722ba37f860185c1df483c1947c55ec17c74d1332e16b29d30b95f1f0f59021dced986db12ae005f7962349f3cd30df74246
6
+ metadata.gz: dbcc40de9887a60357c6e03280c51e1172bebdbd72f34ef549a57b9ea31566cf7b79353e802a4678bf7d7580dc7a10e9a3095aabc6c44b08983b88027e1d59f4
7
+ data.tar.gz: 35debfa95facb9a6419d462352a42e08d8dfe6810ff0432b6b41d653ce1decf5373e27e25fc4c0ff17457c9949258228abe022c4b5e89e2ac5c642a8012ba4f5
@@ -94,6 +94,7 @@ module Admin
94
94
  attribute :name, :string
95
95
  attribute :email, :string
96
96
  attribute :last_sign_in_at, :date
97
+ attribute :last_sign_out_at, :date
97
98
  attribute :sign_in_count, :integer
98
99
  attribute :password_login, :enum, scope: :has_password_login, multiple: false
99
100
  attribute :passkey, :boolean, scope: :has_passkey
@@ -41,9 +41,7 @@ module Admin
41
41
  end
42
42
 
43
43
  def destroy
44
- record_sign_out!(Koi::Current.admin_user)
45
-
46
- session[:admin_user_id] = nil
44
+ destroy_admin_session!
47
45
 
48
46
  redirect_to new_admin_session_path
49
47
  end
@@ -103,11 +101,14 @@ module Admin
103
101
  def authenticate_local_admin
104
102
  return if admin_signed_in? || !Rails.env.development?
105
103
 
106
- Koi::Current.admin_user = Admin::User.find_by(email: "#{ENV.fetch('USER', nil)}@katalyst.com.au")
104
+ Koi::Current.admin_user = Admin::User.find_by(email: [
105
+ ENV.fetch("EMAIL", nil),
106
+ "#{ENV.fetch('USER', nil)}@katalyst.com.au",
107
+ ].compact)
107
108
 
108
109
  return unless admin_signed_in?
109
110
 
110
- session[:admin_user_id] = Koi::Current.admin_user.id
111
+ create_admin_session!
111
112
 
112
113
  flash.delete(:redirect) if (redirect = flash[:redirect])
113
114
 
@@ -115,9 +116,9 @@ module Admin
115
116
  end
116
117
 
117
118
  def admin_sign_in(admin_user)
118
- record_sign_in!(admin_user)
119
+ Koi::Current.admin_user = admin_user
119
120
 
120
- session[:admin_user_id] = admin_user.id
121
+ create_admin_session!
121
122
 
122
123
  redirect_to(url_from(params[:redirect].presence) || admin_dashboard_path, status: :see_other)
123
124
  end
@@ -22,9 +22,7 @@ module Admin
22
22
 
23
23
  def update
24
24
  if (@admin_user = Admin::User.find_by_token_for(:password_reset, params[:token]))
25
- record_sign_in!(admin_user)
26
-
27
- session[:admin_user_id] = admin_user.id
25
+ create_admin_session!(admin_user)
28
26
 
29
27
  if admin_user.credentials.any?
30
28
  redirect_to(admin_root_path, status: :see_other)
@@ -3,33 +3,46 @@
3
3
  module Koi
4
4
  module Controller
5
5
  module RecordsAuthentication
6
- def update_last_sign_in(admin_user)
7
- return if admin_user.current_sign_in_at.blank?
6
+ def create_admin_session!(admin_user = Koi::Current.admin_user)
7
+ sign_in_at = Time.current
8
8
 
9
- admin_user.last_sign_in_at = admin_user.current_sign_in_at
10
- admin_user.last_sign_in_ip = admin_user.current_sign_in_ip
11
- end
12
-
13
- def record_sign_in!(admin_user)
14
9
  update_last_sign_in(admin_user)
15
10
 
16
- admin_user.current_sign_in_at = Time.current
11
+ admin_user.current_sign_in_at = sign_in_at
17
12
  admin_user.current_sign_in_ip = request.remote_ip
18
13
  admin_user.sign_in_count += 1
19
14
 
20
15
  admin_user.save!
16
+
17
+ session[:admin_user_id] = admin_user.id
18
+ session[:admin_user_signed_in_at] = sign_in_at.iso8601
21
19
  end
22
20
 
23
- def record_sign_out!(admin_user)
21
+ def destroy_admin_session!(admin_user = Koi::Current.admin_user)
22
+ session[:admin_user_id] = nil
23
+ session[:admin_user_signed_in_at] = nil
24
+
24
25
  return unless admin_user
25
26
 
27
+ sign_out_at = Time.current
28
+
26
29
  update_last_sign_in(admin_user)
27
30
 
31
+ admin_user.last_sign_out_at = sign_out_at
28
32
  admin_user.current_sign_in_at = nil
29
33
  admin_user.current_sign_in_ip = nil
30
34
 
31
35
  admin_user.save!
32
36
  end
37
+
38
+ private
39
+
40
+ def update_last_sign_in(admin_user)
41
+ return if admin_user.current_sign_in_at.blank?
42
+
43
+ admin_user.last_sign_in_at = admin_user.current_sign_in_at
44
+ admin_user.last_sign_in_ip = admin_user.current_sign_in_ip
45
+ end
33
46
  end
34
47
  end
35
48
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddLastSignOutAtToAdminUsers < ActiveRecord::Migration[8.0]
4
+ def change
5
+ add_column :admins, :last_sign_out_at, :datetime
6
+ end
7
+ end
@@ -27,7 +27,10 @@ module Koi
27
27
  end
28
28
 
29
29
  # Remove from session if not found
30
- session.delete(:admin_user_id) if session.has_key?(:admin_user_id) && !authenticated?
30
+ if session.has_key?(:admin_user_id) && !authenticated?
31
+ session.delete(:admin_user_id)
32
+ session.delete(:admin_user_signed_in_at)
33
+ end
31
34
 
32
35
  if requires_authentication?(request) && !authenticated?
33
36
  unauthorized_response(request)
@@ -58,7 +61,20 @@ module Koi
58
61
  end
59
62
 
60
63
  def session_admin_user(session)
61
- Admin::User.find_by(id: session[:admin_user_id])
64
+ admin_user = Admin::User.find_by(id: session[:admin_user_id])
65
+ return unless admin_user
66
+
67
+ signed_in_at = session_signed_in_at(session)
68
+ return if signed_in_at.blank?
69
+ return if admin_user.last_sign_out_at.present? && signed_in_at < admin_user.last_sign_out_at
70
+
71
+ admin_user
72
+ end
73
+
74
+ def session_signed_in_at(session)
75
+ Time.zone.parse(session[:admin_user_signed_in_at].to_s)
76
+ rescue ArgumentError
77
+ nil
62
78
  end
63
79
 
64
80
  def bearer_token(request)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: katalyst-koi
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.5.0
4
+ version: 5.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katalyst Interactive
@@ -470,6 +470,7 @@ files:
470
470
  - db/migrate/20241214060913_add_otp_secret_to_admin_users.rb
471
471
  - db/migrate/20250204060748_create_well_knowns.rb
472
472
  - db/migrate/20260413014834_create_admin_device_authorizations.rb
473
+ - db/migrate/20260501000000_add_last_sign_out_at_to_admin_users.rb
473
474
  - db/seeds.rb
474
475
  - lib/generators/koi/admin/USAGE
475
476
  - lib/generators/koi/admin/admin_generator.rb