authie 3.3.2 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7e6e128785f1066cf922e408c6f28ae3ae3da8a6db98b3e51c4c74b7e43feb5
4
- data.tar.gz: 35b6e941d8e107432b1249fc6c770009984daac729de967605144a0e79a493fc
3
+ metadata.gz: a3bbd79539a591d214d378e2f70f91ffb144fd6c0dfb31c36a4c0ea3d86bf1a5
4
+ data.tar.gz: 2ba2f38bc671db30ccbde3a6eda511aa642d7d9191dbb2d4311c890ff720249c
5
5
  SHA512:
6
- metadata.gz: d66e30a5133c29f904297c48b16c980362a87e8b6900ccf6528ec33cb3bd3a7007fac8dd62e9f84392b4af9db4fd674e2b03105c0ce65a00541bc8c9e8c2dbb9
7
- data.tar.gz: dcf1015fa423bd07c8cd5b1fbab5125938006706c1e766ed30892359d2560a56df3a458dc15403538f9cc476ba887730a80ba07d1dc809cc40b508876df3ed88
6
+ metadata.gz: 9b325154016b3844263b77a71c484158ee256ab1ff4a67b77f670d167beff464805ab4b8a654931205124389c612a22723133f46f5b0123b9ad7102343c96b50
7
+ data.tar.gz: 9925f9aec3113b474b2a857676c163f570531fa5a5958d272a715fd448b7b5d2de8a1698ca23547023d8d01614009ca04035c11fc9d98ced2f83a1a228b2eaf9
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CreateAuthieSessions < ActiveRecord::Migration[4.2]
2
4
  def change
3
5
  create_table :authie_sessions do |t|
4
6
  t.string :token, :browser_id
5
7
  t.integer :user_id
6
- t.boolean :active, :default => true
8
+ t.boolean :active, default: true
7
9
  t.text :data
8
10
  t.datetime :expires_at
9
11
  t.datetime :login_at
@@ -11,7 +13,7 @@ class CreateAuthieSessions < ActiveRecord::Migration[4.2]
11
13
  t.datetime :last_activity_at
12
14
  t.string :last_activity_ip, :last_activity_path
13
15
  t.string :user_agent
14
- t.timestamps :null => true
16
+ t.timestamps null: true
15
17
  end
16
18
  end
17
19
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddIndexesToAuthieSessions < ActiveRecord::Migration[4.2]
2
4
  def change
3
5
  add_column :authie_sessions, :user_type, :string
4
- add_index :authie_sessions, :token, :length => 10
5
- add_index :authie_sessions, :browser_id, :length => 10
6
+ add_index :authie_sessions, :token, length: 10
7
+ add_index :authie_sessions, :browser_id, length: 10
6
8
  add_index :authie_sessions, :user_id
7
9
  end
8
10
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddParentIdToAuthieSessions < ActiveRecord::Migration[4.2]
2
4
  def change
3
5
  add_column :authie_sessions, :parent_id, :integer
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddTwoFactorAuthFieldsToAuthie < ActiveRecord::Migration[4.2]
2
4
  def change
3
5
  add_column :authie_sessions, :two_factored_at, :datetime
4
6
  add_column :authie_sessions, :two_factored_ip, :string
5
- add_column :authie_sessions, :requests, :integer, :default => 0
7
+ add_column :authie_sessions, :requests, :integer, default: 0
6
8
  add_column :authie_sessions, :password_seen_at, :datetime
7
9
  end
8
10
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddTokenHashesToAuthieSessions < ActiveRecord::Migration[4.2]
2
4
  def change
3
5
  add_column :authie_sessions, :token_hash, :string
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddIndexToTokenHashesOnAuthieSessions < ActiveRecord::Migration[4.2]
2
4
  def change
3
- add_index :authie_sessions, :token_hash, :length => 10
5
+ add_index :authie_sessions, :token_hash, length: 10
4
6
  end
5
7
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddHostToAuthieSessions < ActiveRecord::Migration[4.2]
2
4
  def change
3
5
  add_column :authie_sessions, :host, :string
data/lib/authie.rb CHANGED
@@ -1,8 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'authie/version'
2
4
  require 'authie/config'
3
5
  require 'authie/error'
4
6
  require 'authie/user'
5
7
 
6
- if defined?(Rails)
7
- require 'authie/engine'
8
- end
8
+ require 'authie/engine' if defined?(Rails)
data/lib/authie/config.rb CHANGED
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'authie/event_manager'
2
4
 
3
5
  module Authie
4
6
  class Config
5
-
6
7
  def initialize
7
8
  @callbacks = {}
8
9
  end
@@ -10,17 +11,15 @@ module Authie
10
11
  def session_inactivity_timeout
11
12
  @session_inactivity_timeout || 12.hours
12
13
  end
13
- attr_writer :session_inactivity_timeout
14
+ attr_writer :session_inactivity_timeout, :persistent_session_length, :sudo_session_timeout, :browser_id_cookie_name
14
15
 
15
16
  def persistent_session_length
16
17
  @persistent_session_length || 2.months
17
18
  end
18
- attr_writer :persistent_session_length
19
19
 
20
20
  def sudo_session_timeout
21
21
  @sudo_session_timeout || 10.minutes
22
22
  end
23
- attr_writer :sudo_session_timeout
24
23
 
25
24
  def user_relationship_options
26
25
  @user_relationship_options ||= {}
@@ -29,10 +28,9 @@ module Authie
29
28
  def browser_id_cookie_name
30
29
  @browser_id_cookie_name || :browser_id
31
30
  end
32
- attr_writer :browser_id_cookie_name
33
31
 
34
32
  def events
35
- @event_manager ||= EventManager.new
33
+ @events ||= EventManager.new
36
34
  end
37
35
  end
38
36
 
@@ -44,5 +42,4 @@ module Authie
44
42
  block.call(config)
45
43
  config
46
44
  end
47
-
48
45
  end
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'securerandom'
2
4
  require 'authie/session'
3
5
 
4
6
  module Authie
5
7
  class ControllerDelegate
6
-
7
8
  def initialize(controller)
8
9
  @controller = controller
9
10
  end
@@ -12,24 +13,22 @@ module Authie
12
13
  def set_browser_id
13
14
  until cookies[Authie.config.browser_id_cookie_name]
14
15
  proposed_browser_id = SecureRandom.uuid
15
- unless Authie::Session.where(:browser_id => proposed_browser_id).exists?
16
- cookies[Authie.config.browser_id_cookie_name] = {
17
- :value => proposed_browser_id,
18
- :expires => 5.years.from_now,
19
- :httponly => true,
20
- :secure => @controller.request.ssl?
21
- }
22
- # Dispatch an event when the browser ID is set.
23
- Authie.config.events.dispatch(:set_browser_id, proposed_browser_id)
24
- end
16
+ next if Authie::Session.where(browser_id: proposed_browser_id).exists?
17
+
18
+ cookies[Authie.config.browser_id_cookie_name] = {
19
+ value: proposed_browser_id,
20
+ expires: 5.years.from_now,
21
+ httponly: true,
22
+ secure: @controller.request.ssl?
23
+ }
24
+ # Dispatch an event when the browser ID is set.
25
+ Authie.config.events.dispatch(:set_browser_id, proposed_browser_id)
25
26
  end
26
27
  end
27
28
 
28
29
  # Touch the auth session on each request if logged in
29
30
  def touch_auth_session
30
- if logged_in?
31
- auth_session.touch!
32
- end
31
+ auth_session.touch! if logged_in?
33
32
  end
34
33
 
35
34
  # Return the currently logged in user object
@@ -40,13 +39,12 @@ module Authie
40
39
  # Set the currently logged in user
41
40
  def current_user=(user)
42
41
  create_auth_session(user)
43
- user
44
42
  end
45
43
 
46
44
  # Create a new session for the given user
47
45
  def create_auth_session(user)
48
46
  if user
49
- @auth_session = Authie::Session.start(@controller, :user => user)
47
+ @auth_session = Authie::Session.start(@controller, user: user)
50
48
  else
51
49
  auth_session.invalidate! if logged_in?
52
50
  @auth_session = :none
@@ -81,6 +79,5 @@ module Authie
81
79
  def cookies
82
80
  @controller.send(:cookies)
83
81
  end
84
-
85
82
  end
86
83
  end
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'authie/controller_delegate'
2
4
 
3
5
  module Authie
4
6
  module ControllerExtension
5
-
6
7
  def self.included(base)
7
8
  base.helper_method :logged_in?, :current_user, :auth_session
8
9
  before_action_method = base.respond_to?(:before_action) ? :before_action : :before_filter
@@ -46,6 +47,5 @@ module Authie
46
47
  def auth_session
47
48
  auth_session_delegate.auth_session
48
49
  end
49
-
50
50
  end
51
51
  end
data/lib/authie/engine.rb CHANGED
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authie
2
4
  class Engine < ::Rails::Engine
3
-
4
5
  engine_name 'authie'
5
6
 
6
- initializer 'authie.initialize' do |app|
7
+ initializer 'authie.initialize' do |_app|
7
8
  ActiveSupport.on_load :active_record do
8
9
  require 'authie/session'
9
10
  end
@@ -13,6 +14,5 @@ module Authie
13
14
  include Authie::ControllerExtension
14
15
  end
15
16
  end
16
-
17
17
  end
18
18
  end
data/lib/authie/error.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authie
2
4
  class Error < StandardError
3
5
  end
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authie
2
4
  class EventManager
3
-
4
5
  def initialize
5
6
  @callbacks = {}
6
7
  end
7
8
 
8
9
  def dispatch(event, *args)
9
- if callbacks = @callbacks[event.to_sym]
10
- callbacks.each do |cb|
11
- cb.call(*args)
12
- end
10
+ callbacks = @callbacks[event.to_sym]
11
+ return if callbacks.nil?
12
+
13
+ callbacks.each do |cb|
14
+ cb.call(*args)
13
15
  end
14
16
  end
15
17
 
@@ -19,10 +21,10 @@ module Authie
19
21
  end
20
22
 
21
23
  def remove(event, block)
22
- if cb = @callbacks[event.to_sym]
23
- cb.delete(block)
24
- end
25
- end
24
+ cb = @callbacks[event.to_sym]
25
+ return if cb.nil?
26
26
 
27
+ cb.delete(block)
28
+ end
27
29
  end
28
30
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # If you're dealing with your authentication in a middleware and you only have
2
4
  # access to your rack environment, this will wrap around rack and make it look
3
5
  # close enough to an ActionController to work with Authie
@@ -9,7 +11,6 @@
9
11
 
10
12
  module Authie
11
13
  class RackController
12
-
13
14
  attr_reader :request
14
15
 
15
16
  def initialize(env)
@@ -26,27 +27,22 @@ module Authie
26
27
  def set_browser_id
27
28
  until cookies[:browser_id]
28
29
  proposed_browser_id = SecureRandom.uuid
29
- unless Session.where(:browser_id => proposed_browser_id).exists?
30
- cookies[:browser_id] = {:value => proposed_browser_id, :expires => 20.years.from_now}
30
+ unless Session.where(browser_id: proposed_browser_id).exists?
31
+ cookies[:browser_id] = { value: proposed_browser_id, expires: 20.years.from_now }
31
32
  end
32
33
  end
33
34
  end
34
35
 
35
36
  def current_user=(user)
36
- Session.start(self, :user => user)
37
+ Session.start(self, user: user)
37
38
  end
38
39
 
39
40
  def current_user
40
- if auth_session.is_a?(Session)
41
- auth_session.user
42
- else
43
- nil
44
- end
41
+ auth_session.user if auth_session.is_a?(Session)
45
42
  end
46
43
 
47
44
  def auth_session
48
45
  @auth_session ||= Session.get_session(self)
49
46
  end
50
-
51
47
  end
52
48
  end
@@ -1,49 +1,49 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'secure_random_string'
2
4
 
3
5
  module Authie
4
6
  class Session < ActiveRecord::Base
5
-
6
7
  # Errors which will be raised when there's an issue with a session's
7
8
  # validity in the request.
8
9
  class ValidityError < Error; end
10
+
9
11
  class InactiveSession < ValidityError; end
12
+
10
13
  class ExpiredSession < ValidityError; end
14
+
11
15
  class BrowserMismatch < ValidityError; end
16
+
12
17
  class HostMismatch < ValidityError; end
13
18
 
14
19
  class NoParentSessionForRevert < Error; end
15
20
 
16
21
  # Set table name
17
- self.table_name = "authie_sessions"
22
+ self.table_name = 'authie_sessions'
18
23
 
19
24
  # Relationships
20
- parent_options = {:class_name => "Authie::Session"}
25
+ parent_options = { class_name: 'Authie::Session' }
21
26
  parent_options[:optional] = true if ActiveRecord::VERSION::MAJOR >= 5
22
- belongs_to :parent, parent_options
27
+ belongs_to :parent, **parent_options
23
28
 
24
29
  # Scopes
25
- scope :active, -> { where(:active => true) }
26
- scope :asc, -> { order(:last_activity_at => :desc) }
27
- scope :for_user, -> (user) { where(:user_type => user.class.name, :user_id => user.id) }
30
+ scope :active, -> { where(active: true) }
31
+ scope :asc, -> { order(last_activity_at: :desc) }
32
+ scope :for_user, ->(user) { where(user_type: user.class.name, user_id: user.id) }
28
33
 
29
34
  # Attributes
30
35
  serialize :data, Hash
31
- attr_accessor :controller
32
- attr_accessor :temporary_token
36
+ attr_accessor :controller, :temporary_token
33
37
 
34
38
  before_validation do
35
- if self.user_agent.is_a?(String)
36
- self.user_agent = self.user_agent[0,255]
37
- end
39
+ self.user_agent = user_agent[0, 255] if user_agent.is_a?(String)
38
40
 
39
- if self.last_activity_path.is_a?(String)
40
- self.last_activity_path = self.last_activity_path[0,255]
41
- end
41
+ self.last_activity_path = last_activity_path[0, 255] if last_activity_path.is_a?(String)
42
42
  end
43
43
 
44
44
  before_create do
45
45
  self.temporary_token = SecureRandomString.new(44)
46
- self.token_hash = self.class.hash_token(self.temporary_token)
46
+ self.token_hash = self.class.hash_token(temporary_token)
47
47
  if controller
48
48
  self.user_agent = controller.request.user_agent
49
49
  set_cookie!
@@ -56,10 +56,10 @@ module Authie
56
56
 
57
57
  # Return the user that
58
58
  def user
59
- if self.user_id && self.user_type
60
- @user ||= self.user_type.constantize.find_by(:id => self.user_id) || :none
61
- @user == :none ? nil : @user
62
- end
59
+ return unless user_id && user_type
60
+
61
+ @user ||= user_type.constantize.find_by(id: user_id) || :none
62
+ @user == :none ? nil : @user
63
63
  end
64
64
 
65
65
  # Set the user
@@ -76,35 +76,37 @@ module Authie
76
76
  # This method should be called each time a user performs an
77
77
  # action while authenticated with this session.
78
78
  def touch!
79
- self.check_security!
79
+ check_security!
80
80
  self.last_activity_at = Time.now
81
81
  self.last_activity_ip = controller.request.ip
82
82
  self.last_activity_path = controller.request.path
83
83
  self.requests += 1
84
- self.save!
84
+ save!
85
85
  Authie.config.events.dispatch(:session_touched, self)
86
86
  true
87
87
  end
88
88
 
89
89
  # Sets the cookie on the associated controller.
90
- def set_cookie!(value = self.temporary_token)
90
+ # rubocop:disable Naming/AccessorMethodName
91
+ def set_cookie!(value = temporary_token)
91
92
  cookies[:user_session] = {
92
- :value => value,
93
- :secure => controller.request.ssl?,
94
- :httponly => true,
95
- :expires => self.expires_at
93
+ value: value,
94
+ secure: controller.request.ssl?,
95
+ httponly: true,
96
+ expires: expires_at
96
97
  }
97
98
  Authie.config.events.dispatch(:session_cookie_updated, self)
98
99
  true
99
100
  end
101
+ # rubocop:enable Naming/AccessorMethodName
100
102
 
101
103
  # Sets the cookie for the parent session on the associated controller.
102
104
  def set_parent_cookie!
103
105
  cookies[:parent_user_session] = {
104
- :value => cookies[:user_session],
105
- :secure => controller.request.ssl?,
106
- :httponly => true,
107
- :expires => self.expires_at
106
+ value: cookies[:user_session],
107
+ secure: controller.request.ssl?,
108
+ httponly: true,
109
+ expires: expires_at
108
110
  }
109
111
  Authie.config.events.dispatch(:parent_session_cookie_updated, self)
110
112
  true
@@ -112,57 +114,59 @@ module Authie
112
114
 
113
115
  # Check the security of the session to ensure it can be used.
114
116
  def check_security!
115
- if controller
116
- if cookies[:browser_id] != self.browser_id
117
- invalidate!
118
- Authie.config.events.dispatch(:browser_id_mismatch_error, self)
119
- raise BrowserMismatch, "Browser ID mismatch"
120
- end
121
-
122
- unless self.active?
123
- invalidate!
124
- Authie.config.events.dispatch(:invalid_session_error, self)
125
- raise InactiveSession, "Session is no longer active"
126
- end
127
-
128
- if self.expired?
129
- invalidate!
130
- Authie.config.events.dispatch(:expired_session_error, self)
131
- raise ExpiredSession, "Persistent session has expired"
132
- end
133
-
134
- if self.inactive?
135
- invalidate!
136
- Authie.config.events.dispatch(:inactive_session_error, self)
137
- raise InactiveSession, "Non-persistent session has expired"
138
- end
139
-
140
- if self.host && self.host != controller.request.host
141
- invalidate!
142
- Authie.config.events.dispatch(:host_mismatch_error, self)
143
- raise HostMismatch, "Session was created on #{self.host} but accessed using #{controller.request.host}"
144
- end
117
+ raise Authie::Error, 'Cannot check security without a controller' unless controller
118
+
119
+ if cookies[:browser_id] != browser_id
120
+ invalidate!
121
+ Authie.config.events.dispatch(:browser_id_mismatch_error, self)
122
+ raise BrowserMismatch, 'Browser ID mismatch'
123
+ end
124
+
125
+ unless active?
126
+ invalidate!
127
+ Authie.config.events.dispatch(:invalid_session_error, self)
128
+ raise InactiveSession, 'Session is no longer active'
129
+ end
130
+
131
+ if expired?
132
+ invalidate!
133
+ Authie.config.events.dispatch(:expired_session_error, self)
134
+ raise ExpiredSession, 'Persistent session has expired'
135
+ end
136
+
137
+ if inactive?
138
+ invalidate!
139
+ Authie.config.events.dispatch(:inactive_session_error, self)
140
+ raise InactiveSession, 'Non-persistent session has expired'
141
+ end
142
+
143
+ if host && host != controller.request.host
144
+ invalidate!
145
+ Authie.config.events.dispatch(:host_mismatch_error, self)
146
+ raise HostMismatch, "Session was created on #{host} but accessed using #{controller.request.host}"
145
147
  end
148
+
149
+ true
146
150
  end
147
151
 
148
152
  # Has this persistent session expired?
149
153
  def expired?
150
- self.expires_at &&
151
- self.expires_at < Time.now
154
+ expires_at &&
155
+ expires_at < Time.now
152
156
  end
153
157
 
154
158
  # Has a non-persistent session become inactive?
155
159
  def inactive?
156
- self.expires_at.nil? &&
157
- self.last_activity_at &&
158
- self.last_activity_at < Authie.config.session_inactivity_timeout.ago
160
+ expires_at.nil? &&
161
+ last_activity_at &&
162
+ last_activity_at < Authie.config.session_inactivity_timeout.ago
159
163
  end
160
164
 
161
165
  # Allow this session to persist rather than expiring at the end of the
162
166
  # current browser session
163
167
  def persist!
164
168
  self.expires_at = Authie.config.persistent_session_length.from_now
165
- self.save!
169
+ save!
166
170
  set_cookie!
167
171
  end
168
172
 
@@ -174,16 +178,14 @@ module Authie
174
178
  # Activate an old session
175
179
  def activate!
176
180
  self.active = true
177
- self.save!
181
+ save!
178
182
  end
179
183
 
180
184
  # Mark this session as invalid
181
185
  def invalidate!
182
186
  self.active = false
183
- self.save!
184
- if controller
185
- cookies.delete(:user_session)
186
- end
187
+ save!
188
+ cookies.delete(:user_session) if controller
187
189
  Authie.config.events.dispatch(:session_invalidated, self)
188
190
  true
189
191
  end
@@ -192,7 +194,7 @@ module Authie
192
194
  def set(key, value)
193
195
  self.data ||= {}
194
196
  self.data[key.to_s] = value
195
- self.save!
197
+ save!
196
198
  end
197
199
 
198
200
  # Get some additional data from this session
@@ -202,34 +204,32 @@ module Authie
202
204
 
203
205
  # Invalidate all sessions but this one for this user
204
206
  def invalidate_others!
205
- self.class.where("id != ?", self.id).for_user(self.user).each do |s|
206
- s.invalidate!
207
- end
207
+ self.class.where('id != ?', id).for_user(user).each(&:invalidate!)
208
208
  end
209
209
 
210
210
  # Note that we have just seen the user enter their password.
211
211
  def see_password!
212
212
  self.password_seen_at = Time.now
213
- self.save!
213
+ save!
214
214
  Authie.config.events.dispatch(:seen_password, self)
215
215
  true
216
216
  end
217
217
 
218
218
  # Have we seen the user's password recently in this sesion?
219
219
  def recently_seen_password?
220
- !!(self.password_seen_at && self.password_seen_at >= Authie.config.sudo_session_timeout.ago)
220
+ !!(password_seen_at && password_seen_at >= Authie.config.sudo_session_timeout.ago)
221
221
  end
222
222
 
223
223
  # Is two factor authentication required for this request?
224
224
  def two_factored?
225
- !!(two_factored_at || self.parent_id)
225
+ !!(two_factored_at || parent_id)
226
226
  end
227
227
 
228
228
  # Mark this request as two factor authoritsed
229
229
  def mark_as_two_factored!
230
230
  self.two_factored_at = Time.now
231
231
  self.two_factored_ip = controller.request.ip
232
- self.save!
232
+ save!
233
233
  Authie.config.events.dispatch(:marked_as_two_factored, self)
234
234
  true
235
235
  end
@@ -237,38 +237,38 @@ module Authie
237
237
  # Create a new session for impersonating for the given user
238
238
  def impersonate!(user)
239
239
  set_parent_cookie!
240
- self.class.start(controller, :user => user, :parent => self)
240
+ self.class.start(controller, user: user, parent: self)
241
241
  end
242
242
 
243
243
  # Revert back to the parent session
244
244
  def revert_to_parent!
245
- if self.parent && cookies[:parent_user_session]
246
- self.invalidate!
247
- self.parent.activate!
248
- self.parent.controller = self.controller
249
- self.parent.set_cookie!(cookies[:parent_user_session])
250
- cookies.delete(:parent_user_session)
251
- self.parent
252
- else
253
- raise NoParentSessionForRevert, "Session does not have a parent therefore cannot be reverted."
245
+ unless parent && cookies[:parent_user_session]
246
+ raise NoParentSessionForRevert, 'Session does not have a parent therefore cannot be reverted.'
254
247
  end
248
+
249
+ invalidate!
250
+ parent.activate!
251
+ parent.controller = controller
252
+ parent.set_cookie!(cookies[:parent_user_session])
253
+ cookies.delete(:parent_user_session)
254
+ parent
255
255
  end
256
256
 
257
257
  # Is this the first session for this session's browser?
258
258
  def first_session_for_browser?
259
- self.class.where("id < ?", self.id).for_user(self.user).where(:browser_id => self.browser_id).empty?
259
+ self.class.where('id < ?', id).for_user(user).where(browser_id: browser_id).empty?
260
260
  end
261
261
 
262
262
  # Is this the first session for the IP?
263
263
  def first_session_for_ip?
264
- self.class.where("id < ?", self.id).for_user(self.user).where(:login_ip => self.login_ip).empty?
264
+ self.class.where('id < ?', id).for_user(user).where(login_ip: login_ip).empty?
265
265
  end
266
266
 
267
267
  # Find a session from the database for the given controller instance.
268
268
  # Returns a session object or :none if no session is found.
269
269
  def self.get_session(controller)
270
270
  cookies = controller.send(:cookies)
271
- if cookies[:user_session] && session = self.find_session_by_token(cookies[:user_session])
271
+ if cookies[:user_session] && (session = find_session_by_token(cookies[:user_session]))
272
272
  session.temporary_token = cookies[:user_session]
273
273
  session.controller = controller
274
274
  session
@@ -280,17 +280,18 @@ module Authie
280
280
  # Find a session by a token (either from a hash or from the raw token)
281
281
  def self.find_session_by_token(token)
282
282
  return nil if token.blank?
283
- self.active.where("token = ? OR token_hash = ?", token, self.hash_token(token)).first
283
+
284
+ active.where('token = ? OR token_hash = ?', token, hash_token(token)).first
284
285
  end
285
286
 
286
287
  # Create a new session and return the newly created session object.
287
288
  # Any other sessions for the browser will be invalidated.
288
289
  def self.start(controller, params = {})
289
290
  cookies = controller.send(:cookies)
290
- self.active.where(:browser_id => cookies[:browser_id]).each(&:invalidate!)
291
+ active.where(browser_id: cookies[:browser_id]).each(&:invalidate!)
291
292
  user_object = params.delete(:user)
292
293
 
293
- session = self.new(params)
294
+ session = new(params)
294
295
  session.user = user_object
295
296
  session.controller = controller
296
297
  session.browser_id = cookies[:browser_id]
@@ -306,9 +307,10 @@ module Authie
306
307
  def self.cleanup
307
308
  Authie.config.events.dispatch(:before_cleanup)
308
309
  # Invalidate transient sessions that haven't been used
309
- self.active.where("expires_at IS NULL AND last_activity_at < ?", Authie.config.session_inactivity_timeout.ago).each(&:invalidate!)
310
+ active.where('expires_at IS NULL AND last_activity_at < ?',
311
+ Authie.config.session_inactivity_timeout.ago).each(&:invalidate!)
310
312
  # Invalidate persistent sessions that have expired
311
- self.active.where("expires_at IS NOT NULL AND expires_at < ?", Time.now).each(&:invalidate!)
313
+ active.where('expires_at IS NOT NULL AND expires_at < ?', Time.now).each(&:invalidate!)
312
314
  Authie.config.events.dispatch(:after_cleanup)
313
315
  true
314
316
  end
@@ -320,9 +322,9 @@ module Authie
320
322
 
321
323
  # Convert all existing active sessions to store their tokens in the database
322
324
  def self.convert_tokens_to_hashes
323
- active.where(:token_hash => nil).where("token is not null").each do |s|
324
- hash = self.hash_token(s.token)
325
- self.where(:id => s.id).update_all(:token_hash => hash, :token => nil)
325
+ active.where(token_hash: nil).where('token is not null').each do |s|
326
+ hash = hash_token(s.token)
327
+ where(id: s.id).update_all(token_hash: hash, token: nil)
326
328
  end
327
329
  end
328
330
 
@@ -332,6 +334,5 @@ module Authie
332
334
  def cookies
333
335
  controller.send(:cookies)
334
336
  end
335
-
336
337
  end
337
338
  end
data/lib/authie/user.rb CHANGED
@@ -1,9 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authie
2
4
  module User
3
-
4
5
  def self.included(base)
5
- base.has_many :user_sessions, :class_name => 'Authie::Session', :as => :user, :dependent => :delete_all
6
+ base.has_many :user_sessions, class_name: 'Authie::Session', as: :user, dependent: :delete_all
6
7
  end
7
-
8
8
  end
9
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authie
2
- VERSION = '3.3.2'
4
+ VERSION = '3.4.0'
3
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authie
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.2
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Cooke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-25 00:00:00.000000000 Z
11
+ date: 2021-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: secure_random_string