rodauth 2.37.0 → 2.38.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: 8c4f8a9edcebe8714dfa15132986c74e12e1823837ab71230008c42df9c2432d
4
- data.tar.gz: f5cb984675323f2c2b83bd1d7be0626f511381b69e090c1d39bfb7b31d09321d
3
+ metadata.gz: f79db7dec7147665538bf0b4f8e0c6c554d88396b294f19e5a5ed26543c31d1c
4
+ data.tar.gz: ea377861679a55895bc325b1cf3932970b0de9c773615ba2daecb5805704ae02
5
5
  SHA512:
6
- metadata.gz: 3cdaaafebe4a7dba8b985dd1fbf39087a95fb3a49150e67487024e9374c50da6eced618ef702bfb70fbc483f83f9c29dba873d07bac2b4c1ec442007f3556f61
7
- data.tar.gz: 8774b5ae4c7e430f76705857bd0e80a59a0171c60b9693581ee7eae7c07a1c300b89c38c7d7f660cf01e48e6c2190597449eec4cadf57cd38c08cbe8a2783886
6
+ metadata.gz: 8e13b4dc188867866ee0eda53765091bb48f583d65957e488737b612bde4cf4ae9caa18edd2d88b3c609a7a3e25a51eec42fc5aa25e4083ea51c283310a36cb9
7
+ data.tar.gz: d50e275056bf3196a025e1933ab97ecd88d784c80ec97412cf046bb9718f558da4b321f7fbf52ba09d3554059157ef67f3f407625fd65c237fd2334e170066a7
@@ -67,6 +67,7 @@ module Rodauth
67
67
  auth_value_method :unopen_account_error_status, 403
68
68
  translatable_method :unverified_account_message, "unverified account, please verify account before logging in"
69
69
  auth_value_method :default_field_attributes, ''
70
+ auth_value_method :use_template_fixed_locals?, true
70
71
 
71
72
  redirect(:require_login){"#{prefix}/login"}
72
73
 
@@ -409,6 +410,7 @@ module Rodauth
409
410
 
410
411
  def button_opts(value, opts)
411
412
  opts = Hash[template_opts].merge!(opts)
413
+ _merge_fixed_locals_opts(opts, button_fixed_locals)
412
414
  opts[:locals] = {:value=>value, :opts=>opts}
413
415
  opts[:cache] = cache_templates
414
416
  opts[:cache_key] = :rodauth_button
@@ -542,6 +544,12 @@ module Rodauth
542
544
  has_password? ? ['password'] : []
543
545
  end
544
546
 
547
+ def has_password?
548
+ return @has_password if defined?(@has_password)
549
+ return false unless account || session_value
550
+ @has_password = !!get_password_hash
551
+ end
552
+
545
553
  private
546
554
 
547
555
  def _around_rodauth
@@ -555,6 +563,20 @@ module Rodauth
555
563
  s
556
564
  end
557
565
 
566
+ if RUBY_VERSION >= '2.1'
567
+ def button_fixed_locals
568
+ '(value:, opts:)'
569
+ end
570
+ # :nocov:
571
+ else
572
+ # Work on Ruby 2.0 when using Tilt 2.6+, as Ruby 2.0 does
573
+ # not support required keyword arguments.
574
+ def button_fixed_locals
575
+ '(value: nil, opts: nil)'
576
+ end
577
+ end
578
+ # :nocov:
579
+
558
580
  def database_function_password_match?(name, hash_id, password, salt)
559
581
  db.get(Sequel.function(function_name(name), hash_id, password_hash_using_salt(password, salt)))
560
582
  end
@@ -718,12 +740,6 @@ module Rodauth
718
740
  end
719
741
  end
720
742
 
721
- def has_password?
722
- return @has_password if defined?(@has_password)
723
- return false unless account || session_value
724
- @has_password = !!get_password_hash
725
- end
726
-
727
743
  def password_hash_using_salt(password, salt)
728
744
  BCrypt::Engine.hash_secret(password, salt)
729
745
  end
@@ -766,7 +782,7 @@ module Rodauth
766
782
  end
767
783
 
768
784
  def compute_raw_hmac(data)
769
- raise ArgumentError, "hmac_secret not set" unless hmac_secret
785
+ raise ConfigurationError, "hmac_secret not set" unless hmac_secret
770
786
  compute_raw_hmac_with_secret(data, hmac_secret)
771
787
  end
772
788
 
@@ -885,7 +901,7 @@ module Rodauth
885
901
 
886
902
  def require_response(meth)
887
903
  send(meth)
888
- raise RuntimeError, "#{meth.to_s.sub(/\A_/, '')} overridden without returning a response (should use redirect or request.halt). This is a bug in your Rodauth configuration, not a bug in Rodauth itself."
904
+ raise ConfigurationError, "#{meth.to_s.sub(/\A_/, '')} overridden without returning a response (should use redirect or request.halt)."
889
905
  end
890
906
 
891
907
  def set_session_value(key, value)
@@ -912,6 +928,7 @@ module Rodauth
912
928
 
913
929
  def _view_opts(page)
914
930
  opts = template_opts.dup
931
+ _merge_fixed_locals_opts(opts, '(rodauth: self.rodauth)')
915
932
  opts[:locals] = opts[:locals] ? opts[:locals].dup : {}
916
933
  opts[:locals][:rodauth] = self
917
934
  opts[:cache] = cache_templates
@@ -919,6 +936,14 @@ module Rodauth
919
936
  _template_opts(opts, page)
920
937
  end
921
938
 
939
+ def _merge_fixed_locals_opts(opts, fixed_locals)
940
+ if use_template_fixed_locals? && !opts[:locals]
941
+ fixed_locals_opts = {default_fixed_locals: fixed_locals}
942
+ fixed_locals_opts.merge!(opts[:template_opts]) if opts[:template_opts]
943
+ opts[:template_opts] = fixed_locals_opts
944
+ end
945
+ end
946
+
922
947
  # Set the template path only if there isn't an overridden template in the application.
923
948
  # Result should replace existing template opts.
924
949
  def _template_opts(opts, page)
@@ -930,6 +955,10 @@ module Rodauth
930
955
  end
931
956
 
932
957
  def _view(meth, page)
958
+ unless scope.respond_to?(meth)
959
+ raise ConfigurationError, "attempted to render a built-in view/email template (#{page.inspect}), but rendering is disabled"
960
+ end
961
+
933
962
  scope.send(meth, _view_opts(page))
934
963
  end
935
964
  end
@@ -163,6 +163,10 @@ module Rodauth
163
163
  methods
164
164
  end
165
165
 
166
+ def email_auth_email_recently_sent?
167
+ (email_last_sent = get_email_auth_email_last_sent) && (Time.now - email_last_sent < email_auth_skip_resend_email_within)
168
+ end
169
+
166
170
  private
167
171
 
168
172
  def _multi_phase_login_forms
@@ -171,10 +175,6 @@ module Rodauth
171
175
  forms
172
176
  end
173
177
 
174
- def email_auth_email_recently_sent?
175
- (email_last_sent = get_email_auth_email_last_sent) && (Time.now - email_last_sent < email_auth_skip_resend_email_within)
176
- end
177
-
178
178
  def _email_auth_request
179
179
  if email_auth_email_recently_sent?
180
180
  set_redirect_error_flash email_auth_email_recently_sent_error_flash
@@ -64,7 +64,7 @@ module Rodauth
64
64
  end
65
65
 
66
66
  def jwt_secret
67
- raise ArgumentError, "jwt_secret not set"
67
+ raise ConfigurationError, "jwt_secret not set"
68
68
  end
69
69
 
70
70
  def jwt_session_hash
@@ -105,7 +105,7 @@ module Rodauth
105
105
  jwt_decode_opts
106
106
  end
107
107
 
108
- if JWT::VERSION::MAJOR > 2 || (JWT::VERSION::MAJOR == 2 && JWT::VERSION::MINOR >= 4)
108
+ if JWT.gem_version >= Gem::Version.new("2.4")
109
109
  def _jwt_decode_secrets
110
110
  secrets = [jwt_secret, jwt_old_secret]
111
111
  secrets.compact!
@@ -237,6 +237,10 @@ module Rodauth
237
237
  account_lockouts_ds.update(account_lockouts_email_last_sent_column=>Sequel::CURRENT_TIMESTAMP) if account_lockouts_email_last_sent_column
238
238
  end
239
239
 
240
+ def unlock_account_email_recently_sent?
241
+ (email_last_sent = get_unlock_account_email_last_sent) && (Time.now - email_last_sent < unlock_account_skip_resend_email_within)
242
+ end
243
+
240
244
  private
241
245
 
242
246
  attr_reader :unlock_account_key_value
@@ -278,10 +282,6 @@ module Rodauth
278
282
  return_response unlock_account_request_view
279
283
  end
280
284
 
281
- def unlock_account_email_recently_sent?
282
- (email_last_sent = get_unlock_account_email_last_sent) && (Time.now - email_last_sent < unlock_account_skip_resend_email_within)
283
- end
284
-
285
285
  def use_date_arithmetic?
286
286
  super || db.database_type == :mysql
287
287
  end
@@ -204,16 +204,16 @@ module Rodauth
204
204
  end
205
205
  end
206
206
 
207
+ def reset_password_email_recently_sent?
208
+ (email_last_sent = get_reset_password_email_last_sent) && (Time.now - email_last_sent < reset_password_skip_resend_email_within)
209
+ end
210
+
207
211
  private
208
212
 
209
213
  def _login_form_footer_links
210
214
  super << [20, reset_password_request_path, reset_password_request_link_text]
211
215
  end
212
216
 
213
- def reset_password_email_recently_sent?
214
- (email_last_sent = get_reset_password_email_last_sent) && (Time.now - email_last_sent < reset_password_skip_resend_email_within)
215
- end
216
-
217
217
  attr_reader :reset_password_key_value
218
218
 
219
219
  def after_login_failure
@@ -514,7 +514,7 @@ module Rodauth
514
514
  end
515
515
 
516
516
  def sms_send(phone, message)
517
- raise NotImplementedError, "sms_send needs to be defined in the Rodauth configuration for SMS sending to work"
517
+ raise ConfigurationError, "sms_send needs to be defined in the Rodauth configuration for SMS sending to work"
518
518
  end
519
519
 
520
520
  def update_sms(values)
@@ -240,6 +240,10 @@ module Rodauth
240
240
  send_verify_account_email
241
241
  end
242
242
 
243
+ def verify_account_email_recently_sent?
244
+ account && (email_last_sent = get_verify_account_email_last_sent) && (Time.now - email_last_sent < verify_account_skip_resend_email_within)
245
+ end
246
+
243
247
  private
244
248
 
245
249
  def _login_form_footer_links
@@ -250,10 +254,6 @@ module Rodauth
250
254
  links
251
255
  end
252
256
 
253
- def verify_account_email_recently_sent?
254
- (email_last_sent = get_verify_account_email_last_sent) && (Time.now - email_last_sent < verify_account_skip_resend_email_within)
255
- end
256
-
257
257
  attr_reader :verify_account_key_value
258
258
 
259
259
  def before_login_attempt
@@ -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 = 37
9
+ MINOR = 38
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,8 @@
3
3
  require 'securerandom'
4
4
 
5
5
  module Rodauth
6
+ class ConfigurationError < StandardError; end
7
+
6
8
  def self.lib(opts={}, &block)
7
9
  require 'roda'
8
10
  c = Class.new(Roda)
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rodauth
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.37.0
4
+ version: 2.38.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-11-19 00:00:00.000000000 Z
10
+ date: 2025-01-15 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: sequel
@@ -382,7 +381,6 @@ metadata:
382
381
  documentation_uri: https://rodauth.jeremyevans.net/documentation.html
383
382
  mailing_list_uri: https://github.com/jeremyevans/rodauth/discussions
384
383
  source_code_uri: https://github.com/jeremyevans/rodauth
385
- post_install_message:
386
384
  rdoc_options:
387
385
  - "--quiet"
388
386
  - "--line-numbers"
@@ -404,8 +402,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
404
402
  - !ruby/object:Gem::Version
405
403
  version: '0'
406
404
  requirements: []
407
- rubygems_version: 3.5.22
408
- signing_key:
405
+ rubygems_version: 3.6.2
409
406
  specification_version: 4
410
407
  summary: Authentication and Account Management Framework for Rack Applications
411
408
  test_files: []