rodauth 2.13.0 → 2.17.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -39,12 +39,17 @@ module Rodauth
39
39
  :generate_remember_key_value,
40
40
  :get_remember_key,
41
41
  :load_memory,
42
+ :remembered_session_id,
42
43
  :logged_in_via_remember_key?,
43
44
  :remember_key_value,
44
45
  :remember_login,
45
46
  :remove_remember_key
46
47
  )
47
48
 
49
+ internal_request_method :remember_setup
50
+ internal_request_method :remember_disable
51
+ internal_request_method :account_id_for_remember_key
52
+
48
53
  route do |r|
49
54
  require_account
50
55
  before_remember_route
@@ -81,29 +86,35 @@ module Rodauth
81
86
  end
82
87
  end
83
88
 
84
- def load_memory
85
- return if session[session_key]
86
- return unless cookie = request.cookies[remember_cookie_key]
89
+ def remembered_session_id
90
+ return unless cookie = _get_remember_cookie
87
91
  id, key = cookie.split('_', 2)
88
92
  return unless id && key
89
93
 
90
94
  actual, deadline = active_remember_key_ds(id).get([remember_key_column, remember_deadline_column])
91
- unless actual
92
- forget_login
93
- return
94
- end
95
+ return unless actual
95
96
 
96
97
  if hmac_secret
97
98
  unless valid = timing_safe_eql?(key, compute_hmac(actual))
98
99
  unless raw_remember_token_deadline && raw_remember_token_deadline > convert_timestamp(deadline)
99
- forget_login
100
100
  return
101
101
  end
102
102
  end
103
103
  end
104
104
 
105
105
  unless valid || timing_safe_eql?(key, actual)
106
- forget_login
106
+ return
107
+ end
108
+
109
+ id
110
+ end
111
+
112
+ def load_memory
113
+ return if session[session_key]
114
+
115
+ unless id = remembered_session_id
116
+ # Only set expired cookie if there is already a cookie set.
117
+ forget_login if _get_remember_cookie
107
118
  return
108
119
  end
109
120
 
@@ -180,6 +191,10 @@ module Rodauth
180
191
 
181
192
  private
182
193
 
194
+ def _get_remember_cookie
195
+ request.cookies[remember_cookie_key]
196
+ end
197
+
183
198
  def after_logout
184
199
  forget_login
185
200
  super if defined?(super)
@@ -57,6 +57,9 @@ module Rodauth
57
57
  :account_from_reset_password_key
58
58
  )
59
59
 
60
+ internal_request_method(:reset_password_request)
61
+ internal_request_method
62
+
60
63
  route(:reset_password_request) do |r|
61
64
  check_already_logged_in
62
65
  before_reset_password_request_route
@@ -112,6 +112,13 @@ module Rodauth
112
112
  :sms_valid_phone?
113
113
  )
114
114
 
115
+ internal_request_method :sms_setup
116
+ internal_request_method :sms_confirm
117
+ internal_request_method :sms_request
118
+ internal_request_method :sms_auth
119
+ internal_request_method :valid_sms_auth?
120
+ internal_request_method :sms_disable
121
+
115
122
  route(:sms_request) do |r|
116
123
  require_login
117
124
  require_account_session
@@ -57,6 +57,8 @@ module Rodauth
57
57
  :two_factor_update_session
58
58
  )
59
59
 
60
+ internal_request_method :two_factor_disable
61
+
60
62
  route(:two_factor_manage, 'multifactor-manage') do |r|
61
63
  require_account
62
64
  before_two_factor_manage_route
@@ -60,6 +60,9 @@ module Rodauth
60
60
  :account_from_verify_account_key
61
61
  )
62
62
 
63
+ internal_request_method(:verify_account_resend)
64
+ internal_request_method
65
+
63
66
  route(:verify_account_resend) do |r|
64
67
  verify_account_check_already_logged_in
65
68
  before_verify_account_resend_route
@@ -193,8 +196,7 @@ module Rodauth
193
196
 
194
197
  def new_account(login)
195
198
  if account_from_login(login) && allow_resending_verify_account_email?
196
- set_redirect_error_status(unopen_account_error_status)
197
- set_error_reason :already_an_unverified_account_with_this_login
199
+ set_response_error_reason_status(:already_an_unverified_account_with_this_login, unopen_account_error_status)
198
200
  set_error_flash attempt_to_create_unverified_account_error_flash
199
201
  response.write resend_verify_account_view
200
202
  request.halt
@@ -271,8 +273,7 @@ module Rodauth
271
273
 
272
274
  def before_login_attempt
273
275
  unless open_account?
274
- set_redirect_error_status(unopen_account_error_status)
275
- set_error_reason :unverified_account
276
+ set_response_error_reason_status(:unverified_account, unopen_account_error_status)
276
277
  set_error_flash attempt_to_login_to_unverified_account_error_flash
277
278
  response.write resend_verify_account_view
278
279
  request.halt
@@ -72,7 +72,7 @@ module Rodauth
72
72
  end
73
73
 
74
74
  def account_in_unverified_grace_period?
75
- account || account_from_session
75
+ return false unless account || (session_value && account_from_session)
76
76
  account[account_status_column] == account_unverified_status_value &&
77
77
  verify_account_grace_period &&
78
78
  !verify_account_ds.where(Sequel.date_add(verification_requested_at_column, :seconds=>verify_account_grace_period) > Sequel::CURRENT_TIMESTAMP).empty?
@@ -50,6 +50,8 @@ module Rodauth
50
50
  :account_from_verify_login_change_key
51
51
  )
52
52
 
53
+ internal_request_method
54
+
53
55
  route do |r|
54
56
  before_verify_login_change_route
55
57
 
@@ -6,7 +6,7 @@ module Rodauth
6
6
  MAJOR = 2
7
7
 
8
8
  # The minor version of Rodauth, updated for new feature releases of Rodauth.
9
- MINOR = 13
9
+ MINOR = 17
10
10
 
11
11
  # The patch version of Rodauth, updated only for bug fixes from the last
12
12
  # feature release.
data/lib/rodauth.rb CHANGED
@@ -3,6 +3,17 @@
3
3
  require 'securerandom'
4
4
 
5
5
  module Rodauth
6
+ def self.lib(opts={}, &block)
7
+ require 'roda'
8
+ c = Class.new(Roda)
9
+ c.plugin(:rodauth, opts) do
10
+ enable :internal_request
11
+ instance_exec(&block)
12
+ end
13
+ c.freeze
14
+ c.rodauth
15
+ end
16
+
6
17
  def self.load_dependencies(app, opts={})
7
18
  json_opt = opts.fetch(:json, app.opts[:rodauth_json])
8
19
  if json_opt
@@ -39,11 +50,11 @@ module Rodauth
39
50
  else
40
51
  json_opt != :only
41
52
  end
42
- auth_class = (app.opts[:rodauths] ||= {})[opts[:name]] ||= opts[:auth_class] || Class.new(Auth)
53
+ auth_class = (app.opts[:rodauths] ||= {})[opts[:name]] ||= opts[:auth_class] || Class.new(Auth){@configuration_name = opts[:name]}
43
54
  if !auth_class.roda_class
44
55
  auth_class.roda_class = app
45
56
  elsif auth_class.roda_class != app
46
- auth_class = app.opts[:rodauths][opts[:name]] = Class.new(auth_class)
57
+ auth_class = app.opts[:rodauths][opts[:name]] = Class.new(auth_class){@configuration_name = opts[:name]}
47
58
  auth_class.roda_class = app
48
59
  end
49
60
  auth_class.configure(&block) if block
@@ -107,6 +118,7 @@ module Rodauth
107
118
  attr_accessor :dependencies
108
119
  attr_accessor :routes
109
120
  attr_accessor :configuration
121
+ attr_reader :internal_request_methods
110
122
 
111
123
  def route(name=feature_name, default=name.to_s.tr('_', '-'), &block)
112
124
  route_meth = :"#{name}_route"
@@ -152,6 +164,10 @@ module Rodauth
152
164
  FEATURES[name] = feature
153
165
  end
154
166
 
167
+ def internal_request_method(name=feature_name)
168
+ (@internal_request_methods ||= []) << name
169
+ end
170
+
155
171
  def configuration_module_eval(&block)
156
172
  configuration.module_eval(&block)
157
173
  end
@@ -260,6 +276,8 @@ module Rodauth
260
276
  attr_reader :features
261
277
  attr_reader :routes
262
278
  attr_accessor :route_hash
279
+ attr_reader :configuration_name
280
+ attr_reader :configuration
263
281
  end
264
282
 
265
283
  def self.inherited(subclass)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rodauth
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.13.0
4
+ version: 2.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-23 00:00:00.000000000 Z
11
+ date: 2021-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -268,6 +268,7 @@ extra_rdoc_files:
268
268
  - doc/email_base.rdoc
269
269
  - doc/error_reasons.rdoc
270
270
  - doc/http_basic_auth.rdoc
271
+ - doc/internal_request.rdoc
271
272
  - doc/json.rdoc
272
273
  - doc/jwt.rdoc
273
274
  - doc/jwt_cors.rdoc
@@ -281,6 +282,7 @@ extra_rdoc_files:
281
282
  - doc/password_expiration.rdoc
282
283
  - doc/password_grace_period.rdoc
283
284
  - doc/password_pepper.rdoc
285
+ - doc/path_class_methods.rdoc
284
286
  - doc/recovery_codes.rdoc
285
287
  - doc/remember.rdoc
286
288
  - doc/reset_password.rdoc
@@ -325,6 +327,10 @@ extra_rdoc_files:
325
327
  - doc/release_notes/2.11.0.txt
326
328
  - doc/release_notes/2.12.0.txt
327
329
  - doc/release_notes/2.13.0.txt
330
+ - doc/release_notes/2.14.0.txt
331
+ - doc/release_notes/2.15.0.txt
332
+ - doc/release_notes/2.16.0.txt
333
+ - doc/release_notes/2.17.0.txt
328
334
  - doc/release_notes/2.2.0.txt
329
335
  - doc/release_notes/2.3.0.txt
330
336
  - doc/release_notes/2.4.0.txt
@@ -377,6 +383,7 @@ files:
377
383
  - doc/guides/status_column.rdoc
378
384
  - doc/guides/totp_or_recovery.rdoc
379
385
  - doc/http_basic_auth.rdoc
386
+ - doc/internal_request.rdoc
380
387
  - doc/json.rdoc
381
388
  - doc/jwt.rdoc
382
389
  - doc/jwt_cors.rdoc
@@ -390,6 +397,7 @@ files:
390
397
  - doc/password_expiration.rdoc
391
398
  - doc/password_grace_period.rdoc
392
399
  - doc/password_pepper.rdoc
400
+ - doc/path_class_methods.rdoc
393
401
  - doc/recovery_codes.rdoc
394
402
  - doc/release_notes/1.0.0.txt
395
403
  - doc/release_notes/1.1.0.txt
@@ -421,6 +429,10 @@ files:
421
429
  - doc/release_notes/2.11.0.txt
422
430
  - doc/release_notes/2.12.0.txt
423
431
  - doc/release_notes/2.13.0.txt
432
+ - doc/release_notes/2.14.0.txt
433
+ - doc/release_notes/2.15.0.txt
434
+ - doc/release_notes/2.16.0.txt
435
+ - doc/release_notes/2.17.0.txt
424
436
  - doc/release_notes/2.2.0.txt
425
437
  - doc/release_notes/2.3.0.txt
426
438
  - doc/release_notes/2.4.0.txt
@@ -462,6 +474,7 @@ files:
462
474
  - lib/rodauth/features/email_auth.rb
463
475
  - lib/rodauth/features/email_base.rb
464
476
  - lib/rodauth/features/http_basic_auth.rb
477
+ - lib/rodauth/features/internal_request.rb
465
478
  - lib/rodauth/features/json.rb
466
479
  - lib/rodauth/features/jwt.rb
467
480
  - lib/rodauth/features/jwt_cors.rb
@@ -475,6 +488,7 @@ files:
475
488
  - lib/rodauth/features/password_expiration.rb
476
489
  - lib/rodauth/features/password_grace_period.rb
477
490
  - lib/rodauth/features/password_pepper.rb
491
+ - lib/rodauth/features/path_class_methods.rb
478
492
  - lib/rodauth/features/recovery_codes.rb
479
493
  - lib/rodauth/features/remember.rb
480
494
  - lib/rodauth/features/reset_password.rb
@@ -574,7 +588,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
574
588
  - !ruby/object:Gem::Version
575
589
  version: '0'
576
590
  requirements: []
577
- rubygems_version: 3.2.15
591
+ rubygems_version: 3.2.22
578
592
  signing_key:
579
593
  specification_version: 4
580
594
  summary: Authentication and Account Management Framework for Rack Applications