rodauth 2.33.0 → 2.35.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 +28 -0
- data/README.rdoc +5 -4
- data/doc/active_sessions.rdoc +3 -1
- data/doc/guides/render_confirmation.rdoc +1 -1
- data/doc/login.rdoc +2 -2
- data/doc/release_notes/2.34.0.txt +36 -0
- data/doc/release_notes/2.35.0.txt +22 -0
- data/lib/rodauth/features/active_sessions.rb +15 -1
- data/lib/rodauth/features/base.rb +8 -3
- data/lib/rodauth/features/internal_request.rb +14 -4
- data/lib/rodauth/features/login.rb +4 -0
- data/lib/rodauth/features/webauthn.rb +56 -16
- data/lib/rodauth/version.rb +1 -1
- data/lib/rodauth.rb +2 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2b961b8668976f18f46df1c499c1c8f101e75a76527feef460419ad71d7d15b
|
4
|
+
data.tar.gz: 446184720914538cd207b90cb0d6b9e484eadb12559be84f117532aed5d1cf87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 548c5f50659441297116a0343d2cf2160a8f54ec7c0f7b87867e6377bf9165a53db9b69802f2573343031a26c073ef3e4d0e4358163a97686511b32448f05f5f
|
7
|
+
data.tar.gz: bf33b84dcb33a6f5cb54f4df2f4561d57d74cc91040032d3eee58e72dbdedad618b726daff2341e91f4350a451b816f719c836f6211acfe20ffaecb879e736d5
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,31 @@
|
|
1
|
+
=== 2.35.0 (2025-05-28)
|
2
|
+
|
3
|
+
* Handle internal_request_configuration blocks in superclasses (jeremyevans, bjeanes)
|
4
|
+
|
5
|
+
* Avoid unused block warning on Ruby 3.4 (jeremyevans)
|
6
|
+
|
7
|
+
* Add throw_rodauth_error method to make it possible to throw without setting a field error (jf) (#418)
|
8
|
+
|
9
|
+
* Support logging out all active sessions for a loaded account that is not logged in (such as after resetting password) (enescakir) (#401)
|
10
|
+
|
11
|
+
=== 2.34.0 (2024-03-22)
|
12
|
+
|
13
|
+
* Add remove_all_active_sessions_except_current method for removing current active session (jeremyevans) (#395)
|
14
|
+
|
15
|
+
* Add remove_all_active_sessions_except_for method for removing active sessions except for given session id (jeremyevans) (#395)
|
16
|
+
|
17
|
+
* Avoid overriding WebAuthn internals when using webauthn 3 (santiagorodriguez96, jeremyevans) (#398)
|
18
|
+
|
19
|
+
* Support overriding webauthn_rp_id when verifying Webauthn credentials (butsjoh, jeremyevans) (#397)
|
20
|
+
|
21
|
+
* Override require_login_redirect in login feature to use login_path (janko) (#396)
|
22
|
+
|
23
|
+
* Do not override convert_token_id_to_integer? if the user has already configured it (janko) (#393)
|
24
|
+
|
25
|
+
* Have uses_two_factor_authentication? handle case where account has been deleted (janko) (#390)
|
26
|
+
|
27
|
+
* Add current_route accessor to allow easy determination of which rodauth route was requested (janko) (#381)
|
28
|
+
|
1
29
|
=== 2.33.0 (2023-12-21)
|
2
30
|
|
3
31
|
* Expire SMS confirm code after 24 hours by default (jeremyevans)
|
data/README.rdoc
CHANGED
@@ -338,10 +338,10 @@ PostgreSQL sets up new tables in the public schema by default.
|
|
338
338
|
If you would like to use separate schemas per user, you can do:
|
339
339
|
|
340
340
|
psql -U postgres -c "DROP SCHEMA public;" ${DATABASE_NAME}
|
341
|
-
psql -U postgres -c "CREATE SCHEMA
|
342
|
-
psql -U postgres -c "CREATE SCHEMA
|
343
|
-
psql -U postgres -c "GRANT USAGE ON SCHEMA ${DATABASE_NAME}
|
344
|
-
psql -U postgres -c "GRANT USAGE ON SCHEMA ${DATABASE_NAME}_password TO ${DATABASE_NAME};"
|
341
|
+
psql -U postgres -c "CREATE SCHEMA AUTHORIZATION ${DATABASE_NAME};" ${DATABASE_NAME}
|
342
|
+
psql -U postgres -c "CREATE SCHEMA AUTHORIZATION ${DATABASE_NAME}_password;" ${DATABASE_NAME}
|
343
|
+
psql -U postgres -c "GRANT USAGE ON SCHEMA ${DATABASE_NAME} TO ${DATABASE_NAME}_password;" ${DATABASE_NAME}
|
344
|
+
psql -U postgres -c "GRANT USAGE ON SCHEMA ${DATABASE_NAME}_password TO ${DATABASE_NAME};" ${DATABASE_NAME}
|
345
345
|
|
346
346
|
You'll need to modify the code to load the extension to specify the schema:
|
347
347
|
|
@@ -830,6 +830,7 @@ scope :: Roda instance
|
|
830
830
|
session :: session hash
|
831
831
|
flash :: flash message hash
|
832
832
|
account :: account hash (if set by an earlier Rodauth method)
|
833
|
+
current_route :: route name symbol (if Rodauth is handling the route)
|
833
834
|
|
834
835
|
So if you want to log the IP address for the user during login:
|
835
836
|
|
data/doc/active_sessions.rdoc
CHANGED
@@ -49,6 +49,8 @@ currently_active_session? :: Whether the session is currently active, by checkin
|
|
49
49
|
handle_duplicate_active_session_id(exception) :: How to handle the case where a duplicate session id for the account is inserted into the table. Does nothing by default. This should only be called if the random number generator is broken.
|
50
50
|
no_longer_active_session :: What action to take if +rodauth.check_active_session+ is called and the session is no longer active.
|
51
51
|
remove_active_session(session_id) :: Removes the active session matching the given session ID from the database. Useful for implementing session revoking.
|
52
|
-
remove_all_active_sessions :: Remove all active
|
52
|
+
remove_all_active_sessions :: Remove all active sessions for the account from the database, used for global logouts and when closing accounts.
|
53
|
+
remove_all_active_sessions_except_for(session_id) :: Remove all active sessions for the account from the database, except for the session id given.
|
54
|
+
remove_all_active_sessions_except_current :: Remove all active sessions for the account from the database, except for the current session.
|
53
55
|
remove_current_session :: Remove current session from the database, used for regular logouts.
|
54
56
|
remove_inactive_sessions :: Remove inactive sessions from the database, run before checking for whether the current session is active.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
= Render confirmation view
|
2
2
|
|
3
|
-
Most Rodauth actions redirect and display a flash notice after they're
|
3
|
+
Most Rodauth actions redirect and display a flash notice after they're successfully performed. However, in some cases you may wish to render a view confirming that the action was successful, for nicer user experience.
|
4
4
|
|
5
5
|
For example, when the user creates an account, you might render a page with a call to action to verify their account. Assuming you've created an +account_created+ view template alongside your other Rodauth templates, you can configure the following:
|
6
6
|
|
data/doc/login.rdoc
CHANGED
@@ -14,9 +14,8 @@ location.
|
|
14
14
|
|
15
15
|
login_additional_form_tags :: HTML fragment containing additional form tags to use on the login form.
|
16
16
|
login_button :: The text to use for the login button.
|
17
|
-
login_error_flash :: The flash error to show for an
|
17
|
+
login_error_flash :: The flash error to show for an unsuccessful login.
|
18
18
|
login_error_status :: The response status to use when using an invalid login or password to login, 401 by default.
|
19
|
-
login_form_footer :: A message to display after the login form.
|
20
19
|
login_form_footer_links :: An array of entries for links to show on the login page. Each entry is an array of three elements, sort order (integer), link href, and link text.
|
21
20
|
login_form_footer_links_heading :: A heading to show before the login form footer links.
|
22
21
|
login_notice_flash :: The flash notice to show after successful login.
|
@@ -33,6 +32,7 @@ use_multi_phase_login? :: Whether to ask for login first, and only ask for passw
|
|
33
32
|
== Auth Methods
|
34
33
|
|
35
34
|
before_login_route :: Run arbitrary code before handling a login route.
|
35
|
+
login_form_footer :: A message to display after the login form.
|
36
36
|
login_response :: Return a response after a successful login. By default, redirects to +login_redirect+ (or the requested location if +login_return_to_requested_location?+ is true).
|
37
37
|
login_return_to_requested_location_path :: If +login_return_to_requested_location?+ is true, the path to use as the requested location. By default, uses the full path of the request for GET requests, and is nil for non-GET requests (in which case the default +login_redirect+ will be used).
|
38
38
|
login_view :: The HTML to use for the login form.
|
@@ -0,0 +1,36 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A rodauth.current_route method has been added for returning the route
|
4
|
+
name symbol (if rodauth is currently handling the route). This makes it
|
5
|
+
simpler to write code that extends Rodauth and works with
|
6
|
+
applications that use override the default route names.
|
7
|
+
|
8
|
+
* A remove_all_active_sessions_except_for method has been added to the
|
9
|
+
active_sessions feature, which removes all active sessions for the
|
10
|
+
current account, except for the session id given.
|
11
|
+
|
12
|
+
* A remove_all_active_sessions_except_current method has been added to
|
13
|
+
the active_sessions feature, which removes all active sessions for
|
14
|
+
the current account, except for the current session.
|
15
|
+
|
16
|
+
= Improvements
|
17
|
+
|
18
|
+
* Rodauth now supports overriding webauthn_rp_id in the webauthn
|
19
|
+
feature.
|
20
|
+
|
21
|
+
* When using the login feature, Rodauth now defaults
|
22
|
+
require_login_redirect to use the path to the login route, instead
|
23
|
+
of /login.
|
24
|
+
|
25
|
+
* When setting up multifactor authentication, Rodauth now handles the
|
26
|
+
case where account has been deleted, instead of raising an exception.
|
27
|
+
|
28
|
+
* When a database connection is not available during startup, Rodauth
|
29
|
+
now handles that case instead of raising an exception. Note that in
|
30
|
+
this case, Rodauth cannot automatically setup a conversion of token
|
31
|
+
ids to integer, since it cannot determine whether the underlying
|
32
|
+
database column uses an integer type.
|
33
|
+
|
34
|
+
* When using WebAuthn 3+, Rodauth no longer defines singleton methods
|
35
|
+
to work around limitations in WebAuthn. Instead, it uses public
|
36
|
+
APIs that were added in WebAuthn 3.
|
@@ -0,0 +1,22 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A throw_rodauth_error method has been added to make it easier
|
4
|
+
for external extensions to throw the expected error value without
|
5
|
+
setting a field error.
|
6
|
+
|
7
|
+
= Improvements
|
8
|
+
|
9
|
+
* If an account is not currently logged in, but Rodauth knows the
|
10
|
+
related account id, remove_all_active_sessions and related
|
11
|
+
methods in the active_sessions plugin will now remove sessions
|
12
|
+
for the related account.
|
13
|
+
|
14
|
+
* When using the internal_request feature and subclasses,
|
15
|
+
internal_request_configuration blocks in superclasses are now
|
16
|
+
respected when creating the internal request class for a
|
17
|
+
subclass. When creating the internal request in the subclass,
|
18
|
+
this behaves as if all internal_request_configuration blocks
|
19
|
+
were specified directly in the subclass.
|
20
|
+
|
21
|
+
* An ignored block warning on Ruby 3.4 is now avoided by having
|
22
|
+
Rodauth.load_dependencies accept a block.
|
@@ -31,6 +31,8 @@ module Rodauth
|
|
31
31
|
:no_longer_active_session,
|
32
32
|
:remove_active_session,
|
33
33
|
:remove_all_active_sessions,
|
34
|
+
:remove_all_active_sessions_except_for,
|
35
|
+
:remove_all_active_sessions_except_current,
|
34
36
|
:remove_current_session,
|
35
37
|
:remove_inactive_sessions,
|
36
38
|
)
|
@@ -95,6 +97,18 @@ module Rodauth
|
|
95
97
|
active_sessions_ds.delete
|
96
98
|
end
|
97
99
|
|
100
|
+
def remove_all_active_sessions_except_for(session_id)
|
101
|
+
active_sessions_ds.exclude(active_sessions_session_id_column=>compute_hmacs(session_id)).delete
|
102
|
+
end
|
103
|
+
|
104
|
+
def remove_all_active_sessions_except_current
|
105
|
+
if session_id = session[session_id_session_key]
|
106
|
+
remove_all_active_sessions_except_for(session_id)
|
107
|
+
else
|
108
|
+
remove_all_active_sessions
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
98
112
|
def remove_inactive_sessions
|
99
113
|
if cond = inactive_session_cond
|
100
114
|
active_sessions_ds.where(cond).delete
|
@@ -184,7 +198,7 @@ module Rodauth
|
|
184
198
|
|
185
199
|
def active_sessions_ds
|
186
200
|
db[active_sessions_table].
|
187
|
-
where(active_sessions_account_id_column=>session_value)
|
201
|
+
where(active_sessions_account_id_column=>session_value || account_id)
|
188
202
|
end
|
189
203
|
|
190
204
|
def use_date_arithmetic?
|
@@ -136,6 +136,7 @@ module Rodauth
|
|
136
136
|
|
137
137
|
attr_reader :scope
|
138
138
|
attr_reader :account
|
139
|
+
attr_reader :current_route
|
139
140
|
|
140
141
|
def initialize(scope)
|
141
142
|
@scope = scope
|
@@ -428,7 +429,7 @@ module Rodauth
|
|
428
429
|
require 'bcrypt' if require_bcrypt?
|
429
430
|
db.extension :date_arithmetic if use_date_arithmetic?
|
430
431
|
|
431
|
-
if convert_token_id_to_integer
|
432
|
+
if method(:convert_token_id_to_integer?).owner == Rodauth::Base && (db rescue false) && db.table_exists?(accounts_table) && db.schema(accounts_table).find{|col, v| break v[:type] == :integer if col == account_id_column}
|
432
433
|
self.class.send(:define_method, :convert_token_id_to_integer?){true}
|
433
434
|
end
|
434
435
|
|
@@ -642,9 +643,13 @@ module Rodauth
|
|
642
643
|
set_response_error_status(status)
|
643
644
|
end
|
644
645
|
|
646
|
+
def throw_rodauth_error
|
647
|
+
throw :rodauth_error
|
648
|
+
end
|
649
|
+
|
645
650
|
def throw_error(field, error)
|
646
651
|
set_field_error(field, error)
|
647
|
-
|
652
|
+
throw_rodauth_error
|
648
653
|
end
|
649
654
|
|
650
655
|
def throw_error_status(status, field, error)
|
@@ -711,7 +716,7 @@ module Rodauth
|
|
711
716
|
# note that only the salt is returned.
|
712
717
|
def get_password_hash
|
713
718
|
if account_password_hash_column
|
714
|
-
account
|
719
|
+
account[account_password_hash_column] if account!
|
715
720
|
elsif use_database_authentication_functions?
|
716
721
|
db.get(Sequel.function(function_name(:rodauth_get_salt), account ? account_id : session_value))
|
717
722
|
else
|
@@ -384,16 +384,26 @@ module Rodauth
|
|
384
384
|
|
385
385
|
return if is_a?(InternalRequestMethods)
|
386
386
|
|
387
|
+
superklasses = []
|
388
|
+
superklass = self.class
|
389
|
+
until superklass == Rodauth::Auth
|
390
|
+
superklasses << superklass
|
391
|
+
superklass = superklass.superclass
|
392
|
+
end
|
393
|
+
|
387
394
|
klass = self.class
|
388
395
|
internal_class = Class.new(klass)
|
389
396
|
internal_class.instance_variable_set(:@configuration_name, klass.configuration_name)
|
397
|
+
configuration = internal_class.configuration
|
390
398
|
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
399
|
+
superklasses.reverse_each do |superklass|
|
400
|
+
if blocks = superklass.instance_variable_get(:@internal_request_configuration_blocks)
|
401
|
+
blocks.each do |block|
|
402
|
+
configuration.instance_exec(&block)
|
403
|
+
end
|
395
404
|
end
|
396
405
|
end
|
406
|
+
|
397
407
|
internal_class.send(:extend, InternalRequestClassMethods)
|
398
408
|
internal_class.send(:include, InternalRequestMethods)
|
399
409
|
internal_class.allocate.post_configure
|
@@ -302,22 +302,17 @@ module Rodauth
|
|
302
302
|
def new_webauthn_credential
|
303
303
|
WebAuthn::Credential.options_for_create(
|
304
304
|
:timeout => webauthn_setup_timeout,
|
305
|
-
:rp => {:name=>webauthn_rp_name, :id=>webauthn_rp_id},
|
306
305
|
:user => {:id=>account_webauthn_user_id, :name=>webauthn_user_name},
|
307
306
|
:authenticator_selection => webauthn_authenticator_selection,
|
308
307
|
:attestation => webauthn_attestation,
|
309
308
|
:extensions => webauthn_extensions,
|
310
309
|
:exclude => account_webauthn_ids,
|
310
|
+
**webauthn_create_relying_party_opts
|
311
311
|
)
|
312
312
|
end
|
313
313
|
|
314
314
|
def valid_new_webauthn_credential?(webauthn_credential)
|
315
|
-
|
316
|
-
origin = webauthn_origin
|
317
|
-
webauthn_credential.response.define_singleton_method(:verify) do |expected_challenge, expected_origin = nil, **kw|
|
318
|
-
super(expected_challenge, expected_origin || origin, **kw)
|
319
|
-
end
|
320
|
-
|
315
|
+
_override_webauthn_credential_response_verify(webauthn_credential)
|
321
316
|
(challenge = param_or_nil(webauthn_setup_challenge_param)) &&
|
322
317
|
(hmac = param_or_nil(webauthn_setup_challenge_hmac_param)) &&
|
323
318
|
(timing_safe_eql?(compute_hmac(challenge), hmac) || (hmac_secret_rotation? && timing_safe_eql?(compute_old_hmac(challenge), hmac))) &&
|
@@ -328,9 +323,9 @@ module Rodauth
|
|
328
323
|
WebAuthn::Credential.options_for_get(
|
329
324
|
:allow => webauthn_allow,
|
330
325
|
:timeout => webauthn_auth_timeout,
|
331
|
-
:rp_id => webauthn_rp_id,
|
332
326
|
:user_verification => webauthn_user_verification,
|
333
327
|
:extensions => webauthn_extensions,
|
328
|
+
**webauthn_get_relying_party_opts
|
334
329
|
)
|
335
330
|
end
|
336
331
|
|
@@ -368,12 +363,7 @@ module Rodauth
|
|
368
363
|
ds = webauthn_keys_ds.where(webauthn_keys_webauthn_id_column => webauthn_credential.id)
|
369
364
|
pub_key, sign_count = ds.get([webauthn_keys_public_key_column, webauthn_keys_sign_count_column])
|
370
365
|
|
371
|
-
|
372
|
-
origin = webauthn_origin
|
373
|
-
webauthn_credential.response.define_singleton_method(:verify) do |expected_challenge, expected_origin = nil, **kw|
|
374
|
-
super(expected_challenge, expected_origin || origin, **kw)
|
375
|
-
end
|
376
|
-
|
366
|
+
_override_webauthn_credential_response_verify(webauthn_credential)
|
377
367
|
(challenge = param_or_nil(webauthn_auth_challenge_param)) &&
|
378
368
|
(hmac = param_or_nil(webauthn_auth_challenge_hmac_param)) &&
|
379
369
|
(timing_safe_eql?(compute_hmac(challenge), hmac) || (hmac_secret_rotation? && timing_safe_eql?(compute_old_hmac(challenge), hmac))) &&
|
@@ -419,6 +409,54 @@ module Rodauth
|
|
419
409
|
|
420
410
|
private
|
421
411
|
|
412
|
+
if WebAuthn::VERSION >= '3'
|
413
|
+
def webauthn_relying_party
|
414
|
+
# No need to memoize, only called once per request
|
415
|
+
WebAuthn::RelyingParty.new(
|
416
|
+
origin: webauthn_origin,
|
417
|
+
id: webauthn_rp_id,
|
418
|
+
name: webauthn_rp_name,
|
419
|
+
)
|
420
|
+
end
|
421
|
+
|
422
|
+
def webauthn_create_relying_party_opts
|
423
|
+
{ :relying_party => webauthn_relying_party }
|
424
|
+
end
|
425
|
+
alias webauthn_get_relying_party_opts webauthn_create_relying_party_opts
|
426
|
+
|
427
|
+
def webauthn_form_submission_call(meth, arg)
|
428
|
+
WebAuthn::Credential.public_send(meth, arg, :relying_party => webauthn_relying_party)
|
429
|
+
end
|
430
|
+
|
431
|
+
def _override_webauthn_credential_response_verify(webauthn_credential)
|
432
|
+
# no need to override
|
433
|
+
end
|
434
|
+
# :nocov:
|
435
|
+
else
|
436
|
+
def webauthn_create_relying_party_opts
|
437
|
+
{:rp => {:name=>webauthn_rp_name, :id=>webauthn_rp_id}}
|
438
|
+
end
|
439
|
+
|
440
|
+
def webauthn_get_relying_party_opts
|
441
|
+
{ :rp_id => webauthn_rp_id }
|
442
|
+
end
|
443
|
+
|
444
|
+
def webauthn_form_submission_call(meth, arg)
|
445
|
+
WebAuthn::Credential.public_send(meth, arg)
|
446
|
+
end
|
447
|
+
|
448
|
+
def _override_webauthn_credential_response_verify(webauthn_credential)
|
449
|
+
# Hack around inability to override expected_origin and rp_id
|
450
|
+
origin = webauthn_origin
|
451
|
+
rp_id = webauthn_rp_id
|
452
|
+
webauthn_credential.response.define_singleton_method(:verify) do |expected_challenge, expected_origin = nil, **kw|
|
453
|
+
kw[:rp_id] = rp_id
|
454
|
+
super(expected_challenge, expected_origin || origin, **kw)
|
455
|
+
end
|
456
|
+
end
|
457
|
+
# :nocov:
|
458
|
+
end
|
459
|
+
|
422
460
|
def _two_factor_auth_links
|
423
461
|
links = super
|
424
462
|
links << [10, webauthn_auth_path, webauthn_auth_link_text] if webauthn_setup? && !two_factor_login_type_match?('webauthn')
|
@@ -464,7 +502,8 @@ module Rodauth
|
|
464
502
|
|
465
503
|
def webauthn_auth_credential_from_form_submission
|
466
504
|
begin
|
467
|
-
webauthn_credential =
|
505
|
+
webauthn_credential = webauthn_form_submission_call(:from_get, webauthn_auth_data)
|
506
|
+
|
468
507
|
unless valid_webauthn_credential_auth?(webauthn_credential)
|
469
508
|
throw_error_reason(:invalid_webauthn_auth_param, invalid_key_error_status, webauthn_auth_param, webauthn_invalid_auth_param_message)
|
470
509
|
end
|
@@ -498,7 +537,8 @@ module Rodauth
|
|
498
537
|
end
|
499
538
|
|
500
539
|
begin
|
501
|
-
webauthn_credential =
|
540
|
+
webauthn_credential = webauthn_form_submission_call(:from_create, webauthn_setup_data)
|
541
|
+
|
502
542
|
unless valid_new_webauthn_credential?(webauthn_credential)
|
503
543
|
throw_error_reason(:invalid_webauthn_setup_param, invalid_field_error_status, webauthn_setup_param, webauthn_invalid_setup_param_message)
|
504
544
|
end
|
data/lib/rodauth/version.rb
CHANGED
data/lib/rodauth.rb
CHANGED
@@ -14,7 +14,7 @@ module Rodauth
|
|
14
14
|
c.rodauth
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.load_dependencies(app, opts={})
|
17
|
+
def self.load_dependencies(app, opts={}, &_)
|
18
18
|
json_opt = opts.fetch(:json, app.opts[:rodauth_json])
|
19
19
|
if json_opt
|
20
20
|
app.plugin :json
|
@@ -138,6 +138,7 @@ module Rodauth
|
|
138
138
|
|
139
139
|
define_method(handle_meth) do
|
140
140
|
request.is send(route_meth) do
|
141
|
+
@current_route = name
|
141
142
|
check_csrf if check_csrf?
|
142
143
|
_around_rodauth do
|
143
144
|
before_rodauth
|
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.35.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:
|
11
|
+
date: 2024-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -351,6 +351,8 @@ extra_rdoc_files:
|
|
351
351
|
- doc/release_notes/2.31.0.txt
|
352
352
|
- doc/release_notes/2.32.0.txt
|
353
353
|
- doc/release_notes/2.33.0.txt
|
354
|
+
- doc/release_notes/2.34.0.txt
|
355
|
+
- doc/release_notes/2.35.0.txt
|
354
356
|
- doc/release_notes/2.4.0.txt
|
355
357
|
- doc/release_notes/2.5.0.txt
|
356
358
|
- doc/release_notes/2.6.0.txt
|
@@ -472,6 +474,8 @@ files:
|
|
472
474
|
- doc/release_notes/2.31.0.txt
|
473
475
|
- doc/release_notes/2.32.0.txt
|
474
476
|
- doc/release_notes/2.33.0.txt
|
477
|
+
- doc/release_notes/2.34.0.txt
|
478
|
+
- doc/release_notes/2.35.0.txt
|
475
479
|
- doc/release_notes/2.4.0.txt
|
476
480
|
- doc/release_notes/2.5.0.txt
|
477
481
|
- doc/release_notes/2.6.0.txt
|
@@ -632,7 +636,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
632
636
|
- !ruby/object:Gem::Version
|
633
637
|
version: '0'
|
634
638
|
requirements: []
|
635
|
-
rubygems_version: 3.
|
639
|
+
rubygems_version: 3.5.9
|
636
640
|
signing_key:
|
637
641
|
specification_version: 4
|
638
642
|
summary: Authentication and Account Management Framework for Rack Applications
|