rodauth 2.14.0 → 2.18.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 +4 -4
- data/CHANGELOG +32 -0
- data/README.rdoc +54 -7
- data/doc/guides/i18n.rdoc +3 -0
- data/doc/internal_request.rdoc +463 -0
- data/doc/path_class_methods.rdoc +10 -0
- data/doc/release_notes/2.15.0.txt +48 -0
- data/doc/release_notes/2.16.0.txt +20 -0
- data/doc/release_notes/2.17.0.txt +10 -0
- data/doc/release_notes/2.18.0.txt +27 -0
- data/lib/rodauth/features/argon2.rb +13 -1
- data/lib/rodauth/features/base.rb +11 -1
- data/lib/rodauth/features/change_login.rb +2 -0
- data/lib/rodauth/features/change_password.rb +2 -0
- data/lib/rodauth/features/close_account.rb +2 -0
- data/lib/rodauth/features/create_account.rb +2 -0
- data/lib/rodauth/features/email_auth.rb +4 -0
- data/lib/rodauth/features/internal_request.rb +371 -0
- data/lib/rodauth/features/json.rb +19 -0
- data/lib/rodauth/features/jwt_refresh.rb +2 -2
- data/lib/rodauth/features/lockout.rb +11 -2
- data/lib/rodauth/features/login.rb +3 -0
- data/lib/rodauth/features/otp.rb +7 -1
- data/lib/rodauth/features/path_class_methods.rb +22 -0
- data/lib/rodauth/features/recovery_codes.rb +4 -0
- data/lib/rodauth/features/remember.rb +10 -2
- data/lib/rodauth/features/reset_password.rb +3 -0
- data/lib/rodauth/features/sms_codes.rb +7 -0
- data/lib/rodauth/features/two_factor_base.rb +2 -0
- data/lib/rodauth/features/verify_account.rb +5 -4
- data/lib/rodauth/features/verify_login_change.rb +2 -0
- data/lib/rodauth/version.rb +1 -1
- data/lib/rodauth.rb +19 -0
- metadata +17 -3
data/lib/rodauth/features/otp.rb
CHANGED
@@ -96,6 +96,12 @@ module Rodauth
|
|
96
96
|
:otp_tmp_key
|
97
97
|
)
|
98
98
|
|
99
|
+
internal_request_method :otp_setup_params
|
100
|
+
internal_request_method :otp_setup
|
101
|
+
internal_request_method :otp_auth
|
102
|
+
internal_request_method :valid_otp_auth?
|
103
|
+
internal_request_method :otp_disable
|
104
|
+
|
99
105
|
route(:otp_auth) do |r|
|
100
106
|
require_login
|
101
107
|
require_account_session
|
@@ -297,7 +303,7 @@ module Rodauth
|
|
297
303
|
end
|
298
304
|
|
299
305
|
def otp_qr_code
|
300
|
-
RQRCode::QRCode.new(otp_provisioning_uri).as_svg(:module_size=>8)
|
306
|
+
RQRCode::QRCode.new(otp_provisioning_uri).as_svg(:module_size=>8, :viewbox=>true)
|
301
307
|
end
|
302
308
|
|
303
309
|
def otp_user_key
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
module Rodauth
|
4
|
+
Feature.define(:path_class_methods, :PathClassMethods) do
|
5
|
+
def post_configure
|
6
|
+
super
|
7
|
+
|
8
|
+
klass = self.class
|
9
|
+
klass.features.each do |feature_name|
|
10
|
+
feature = FEATURES[feature_name]
|
11
|
+
feature.routes.each do |handle_meth|
|
12
|
+
route = handle_meth.to_s.sub(/\Ahandle_/, '')
|
13
|
+
path_meth = :"#{route}_path"
|
14
|
+
url_meth = :"#{route}_url"
|
15
|
+
instance = klass.allocate.freeze
|
16
|
+
klass.define_singleton_method(path_meth){|opts={}| instance.send(path_meth, opts)}
|
17
|
+
klass.define_singleton_method(url_meth){|opts={}| instance.send(url_meth, opts)}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -59,6 +59,10 @@ module Rodauth
|
|
59
59
|
:recovery_code_match?,
|
60
60
|
)
|
61
61
|
|
62
|
+
internal_request_method :recovery_codes
|
63
|
+
internal_request_method :recovery_auth
|
64
|
+
internal_request_method :valid_recovery_auth?
|
65
|
+
|
62
66
|
route(:recovery_auth) do |r|
|
63
67
|
require_login
|
64
68
|
require_account_session
|
@@ -46,6 +46,10 @@ module Rodauth
|
|
46
46
|
:remove_remember_key
|
47
47
|
)
|
48
48
|
|
49
|
+
internal_request_method :remember_setup
|
50
|
+
internal_request_method :remember_disable
|
51
|
+
internal_request_method :account_id_for_remember_key
|
52
|
+
|
49
53
|
route do |r|
|
50
54
|
require_account
|
51
55
|
before_remember_route
|
@@ -83,7 +87,7 @@ module Rodauth
|
|
83
87
|
end
|
84
88
|
|
85
89
|
def remembered_session_id
|
86
|
-
return unless cookie =
|
90
|
+
return unless cookie = _get_remember_cookie
|
87
91
|
id, key = cookie.split('_', 2)
|
88
92
|
return unless id && key
|
89
93
|
|
@@ -110,7 +114,7 @@ module Rodauth
|
|
110
114
|
|
111
115
|
unless id = remembered_session_id
|
112
116
|
# Only set expired cookie if there is already a cookie set.
|
113
|
-
forget_login if
|
117
|
+
forget_login if _get_remember_cookie
|
114
118
|
return
|
115
119
|
end
|
116
120
|
|
@@ -187,6 +191,10 @@ module Rodauth
|
|
187
191
|
|
188
192
|
private
|
189
193
|
|
194
|
+
def _get_remember_cookie
|
195
|
+
request.cookies[remember_cookie_key]
|
196
|
+
end
|
197
|
+
|
190
198
|
def after_logout
|
191
199
|
forget_login
|
192
200
|
super if defined?(super)
|
@@ -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
|
@@ -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
|
-
|
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
|
-
|
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
|
data/lib/rodauth/version.rb
CHANGED
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
|
@@ -46,6 +57,7 @@ module Rodauth
|
|
46
57
|
auth_class = app.opts[:rodauths][opts[:name]] = Class.new(auth_class)
|
47
58
|
auth_class.roda_class = app
|
48
59
|
end
|
60
|
+
auth_class.class_eval{@configuration_name = opts[:name] unless defined?(@configuration_name)}
|
49
61
|
auth_class.configure(&block) if block
|
50
62
|
end
|
51
63
|
|
@@ -107,6 +119,7 @@ module Rodauth
|
|
107
119
|
attr_accessor :dependencies
|
108
120
|
attr_accessor :routes
|
109
121
|
attr_accessor :configuration
|
122
|
+
attr_reader :internal_request_methods
|
110
123
|
|
111
124
|
def route(name=feature_name, default=name.to_s.tr('_', '-'), &block)
|
112
125
|
route_meth = :"#{name}_route"
|
@@ -152,6 +165,10 @@ module Rodauth
|
|
152
165
|
FEATURES[name] = feature
|
153
166
|
end
|
154
167
|
|
168
|
+
def internal_request_method(name=feature_name)
|
169
|
+
(@internal_request_methods ||= []) << name
|
170
|
+
end
|
171
|
+
|
155
172
|
def configuration_module_eval(&block)
|
156
173
|
configuration.module_eval(&block)
|
157
174
|
end
|
@@ -260,6 +277,8 @@ module Rodauth
|
|
260
277
|
attr_reader :features
|
261
278
|
attr_reader :routes
|
262
279
|
attr_accessor :route_hash
|
280
|
+
attr_reader :configuration_name
|
281
|
+
attr_reader :configuration
|
263
282
|
end
|
264
283
|
|
265
284
|
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.
|
4
|
+
version: 2.18.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-
|
11
|
+
date: 2021-11-23 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
|
@@ -326,6 +328,10 @@ extra_rdoc_files:
|
|
326
328
|
- doc/release_notes/2.12.0.txt
|
327
329
|
- doc/release_notes/2.13.0.txt
|
328
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
|
334
|
+
- doc/release_notes/2.18.0.txt
|
329
335
|
- doc/release_notes/2.2.0.txt
|
330
336
|
- doc/release_notes/2.3.0.txt
|
331
337
|
- doc/release_notes/2.4.0.txt
|
@@ -378,6 +384,7 @@ files:
|
|
378
384
|
- doc/guides/status_column.rdoc
|
379
385
|
- doc/guides/totp_or_recovery.rdoc
|
380
386
|
- doc/http_basic_auth.rdoc
|
387
|
+
- doc/internal_request.rdoc
|
381
388
|
- doc/json.rdoc
|
382
389
|
- doc/jwt.rdoc
|
383
390
|
- doc/jwt_cors.rdoc
|
@@ -391,6 +398,7 @@ files:
|
|
391
398
|
- doc/password_expiration.rdoc
|
392
399
|
- doc/password_grace_period.rdoc
|
393
400
|
- doc/password_pepper.rdoc
|
401
|
+
- doc/path_class_methods.rdoc
|
394
402
|
- doc/recovery_codes.rdoc
|
395
403
|
- doc/release_notes/1.0.0.txt
|
396
404
|
- doc/release_notes/1.1.0.txt
|
@@ -423,6 +431,10 @@ files:
|
|
423
431
|
- doc/release_notes/2.12.0.txt
|
424
432
|
- doc/release_notes/2.13.0.txt
|
425
433
|
- doc/release_notes/2.14.0.txt
|
434
|
+
- doc/release_notes/2.15.0.txt
|
435
|
+
- doc/release_notes/2.16.0.txt
|
436
|
+
- doc/release_notes/2.17.0.txt
|
437
|
+
- doc/release_notes/2.18.0.txt
|
426
438
|
- doc/release_notes/2.2.0.txt
|
427
439
|
- doc/release_notes/2.3.0.txt
|
428
440
|
- doc/release_notes/2.4.0.txt
|
@@ -464,6 +476,7 @@ files:
|
|
464
476
|
- lib/rodauth/features/email_auth.rb
|
465
477
|
- lib/rodauth/features/email_base.rb
|
466
478
|
- lib/rodauth/features/http_basic_auth.rb
|
479
|
+
- lib/rodauth/features/internal_request.rb
|
467
480
|
- lib/rodauth/features/json.rb
|
468
481
|
- lib/rodauth/features/jwt.rb
|
469
482
|
- lib/rodauth/features/jwt_cors.rb
|
@@ -477,6 +490,7 @@ files:
|
|
477
490
|
- lib/rodauth/features/password_expiration.rb
|
478
491
|
- lib/rodauth/features/password_grace_period.rb
|
479
492
|
- lib/rodauth/features/password_pepper.rb
|
493
|
+
- lib/rodauth/features/path_class_methods.rb
|
480
494
|
- lib/rodauth/features/recovery_codes.rb
|
481
495
|
- lib/rodauth/features/remember.rb
|
482
496
|
- lib/rodauth/features/reset_password.rb
|
@@ -576,7 +590,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
576
590
|
- !ruby/object:Gem::Version
|
577
591
|
version: '0'
|
578
592
|
requirements: []
|
579
|
-
rubygems_version: 3.2.
|
593
|
+
rubygems_version: 3.2.22
|
580
594
|
signing_key:
|
581
595
|
specification_version: 4
|
582
596
|
summary: Authentication and Account Management Framework for Rack Applications
|