rodauth 2.33.0 → 2.35.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|