rodauth 1.8.0 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +6 -0
  3. data/README.rdoc +61 -15
  4. data/doc/change_login.rdoc +2 -1
  5. data/doc/change_password.rdoc +2 -1
  6. data/doc/close_account.rdoc +2 -1
  7. data/doc/confirm_password.rdoc +2 -1
  8. data/doc/create_account.rdoc +2 -2
  9. data/doc/lockout.rdoc +1 -0
  10. data/doc/login.rdoc +1 -1
  11. data/doc/logout.rdoc +1 -1
  12. data/doc/otp.rdoc +3 -3
  13. data/doc/recovery_codes.rdoc +7 -1
  14. data/doc/release_notes/1.9.0.txt +15 -0
  15. data/doc/remember.rdoc +2 -1
  16. data/doc/reset_password.rdoc +3 -1
  17. data/doc/sms_codes.rdoc +5 -5
  18. data/doc/verify_account.rdoc +3 -1
  19. data/lib/rodauth.rb +22 -0
  20. data/lib/rodauth/features/base.rb +21 -4
  21. data/lib/rodauth/features/change_login.rb +1 -0
  22. data/lib/rodauth/features/change_password.rb +1 -0
  23. data/lib/rodauth/features/close_account.rb +1 -0
  24. data/lib/rodauth/features/confirm_password.rb +1 -0
  25. data/lib/rodauth/features/create_account.rb +1 -0
  26. data/lib/rodauth/features/lockout.rb +1 -0
  27. data/lib/rodauth/features/login.rb +1 -0
  28. data/lib/rodauth/features/logout.rb +1 -0
  29. data/lib/rodauth/features/otp.rb +1 -0
  30. data/lib/rodauth/features/recovery_codes.rb +1 -0
  31. data/lib/rodauth/features/remember.rb +1 -0
  32. data/lib/rodauth/features/reset_password.rb +3 -0
  33. data/lib/rodauth/features/sms_codes.rb +1 -0
  34. data/lib/rodauth/features/verify_account.rb +1 -0
  35. data/lib/rodauth/version.rb +1 -1
  36. data/spec/login_spec.rb +1 -1
  37. data/spec/password_expiration_spec.rb +1 -1
  38. data/spec/reset_password_spec.rb +4 -0
  39. data/spec/rodauth_spec.rb +13 -0
  40. data/spec/spec_helper.rb +6 -1
  41. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 65176959334b7e6fa96008eabe2b3f6f4d69032d
4
- data.tar.gz: 44aeba80765dfc4a4afa4f15848f4004a83d453a
3
+ metadata.gz: 63d284b3ed1dc87ff182d472e730e52d823e4dae
4
+ data.tar.gz: 47599804ed740325e00c8c7bda5dcafde8b669c3
5
5
  SHA512:
6
- metadata.gz: 0500da1e1abe0cf9ed4e3cac1ca02102ab8a388bc6726e35de3934600676e7c886ca0181d2e0bd06385d1cd43015120cf5b4a97dcbaff6ceba4dc66ae8ac9abd
7
- data.tar.gz: 8a5eed74a9f73f0ef22a9965a8c7f74b5c5de6036fa9af62d6adced7304f01a147d3f9e16d2966a79a898766704d512079d801f5be6864929f533db9f1aacfed
6
+ metadata.gz: a4f64fc7c93e5a97c4ef7a100d26dcb286b157a7085c939db4bdce203b3b63f18e239f71ea09cc4881740facacc695c00a220427e91f9daea0aec7f1e65a51d3
7
+ data.tar.gz: 3424177852d8cbf98f1acca6f75c46e23316664950febab7af6af720a55038570fe6d4655d4dc983e0ee29df70ad011a7cff468b5f0169604c3baed09da1e94f
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ === 1.9.0 (2017-02-22)
2
+
3
+ * Make reset-password use existing password reset key if one is present (jeremyevans) (#26)
4
+
5
+ * Add Roda.precompile_rodauth_templates method, useful to save memory when forking, or when chrooting (jeremyevans)
6
+
1
7
  === 1.8.0 (2017-01-06)
2
8
 
3
9
  * Add json_response_custom_error_status? option to jwt feature to use specific 4xx statuses instead of 400 (jeremyevans)
data/README.rdoc CHANGED
@@ -757,12 +757,21 @@ Conversely, if you implement the rodauth_get_salt and
757
757
  rodauth_valid_password_hash functions on a database that isn't
758
758
  PostgreSQL, MySQL, or Microsoft SQL Server, you can set this value to true.
759
759
 
760
- === With Custom Authentication (such as LDAP)
760
+ === With Custom Authentication
761
761
 
762
- You can use Rodauth with other authentication types, by overriding
763
- a single configuration setting. For example, if you have accounts
764
- stored in the database, but authentication happens via LDAP, you
765
- can use the +simple_ldap_authenticator+ library:
762
+ You can use Rodauth with other authentication types, by using some
763
+ of Rodauth's configuration methods.
764
+
765
+ Note that when using custom authentication, using some of Rodauth's
766
+ features such as change login and change password either would not
767
+ make sense or would require some additional custom configuration.
768
+ The login and logout features should work correctly with the examples
769
+ below, though.
770
+
771
+ ==== Using LDAP Authentication
772
+
773
+ If you have accounts stored in the database, but authentication happens
774
+ via LDAP, you can use the +simple_ldap_authenticator+ library:
766
775
 
767
776
  require 'simple_ldap_authenticator'
768
777
  plugin :rodauth do
@@ -783,26 +792,51 @@ any valid LDAP user to login, you can do something like this:
783
792
  # Don't require the bcrypt library, since using LDAP for auth
784
793
  require_bcrypt? false
785
794
 
786
- # Treat the login itself as the account
787
- account_from_login{|l| l.to_s}
795
+ # Store session value in :login key, since the :account_id
796
+ # default wouldn't make sense
797
+ session_key :login
788
798
 
789
799
  # Use the login provided as the session value
790
800
  account_session_value{account}
791
801
 
792
- # Store session value in :login key, since the :account_id
793
- # default wouldn't make sense
794
- session_key :login
802
+ # Treat the login itself as the account
803
+ account_from_login{|l| l.to_s}
795
804
 
796
805
  password_match? do |password|
797
806
  SimpleLdapAuthenticator.valid?(account, password)
798
807
  end
799
808
  end
800
809
 
801
- Note that when using custom authentication, using some of Rodauth's
802
- features such as change login and change password either would not
803
- make sense or would require some additional custom configuration.
804
- The login and logout features should work correctly with the examples
805
- above, though.
810
+ ==== Using Facebook Authentication
811
+
812
+ Here's an example of authentication using Facebook with a JSON API.
813
+ This setup assumes you have client-side code to submit JSON POST requests
814
+ to +/login+ with an +access_token+ parameter that is set to the user's
815
+ Facebook OAuth access token.
816
+
817
+
818
+ require 'koala'
819
+ plugin :rodauth do
820
+ enable :login, :logout, :jwt
821
+
822
+ require_bcrypt? false
823
+ session_key :facebook_email
824
+ account_session_value{account}
825
+
826
+ login_param 'access_token'
827
+
828
+ account_from_login do |access_token|
829
+ fb = Koala::Facebook::API.new(access_token)
830
+ if me = fb.get_object('me', :fields=>[:email])
831
+ me['email']
832
+ end
833
+ end
834
+
835
+ # there is no password!
836
+ password_match? do |pass|
837
+ true
838
+ end
839
+ end
806
840
 
807
841
  === With Other Web Frameworks
808
842
 
@@ -1008,6 +1042,18 @@ by adding an appropriate route before calling +r.rodauth+:
1008
1042
  r.rodauth
1009
1043
  end
1010
1044
 
1045
+ === Precompiling Rodauth Templates
1046
+
1047
+ Rodauth serves templates from it's gem folder. If you are using
1048
+ a forking webserver and want to preload the compiled templates
1049
+ to save memory, or if you are chrooting your application, you can
1050
+ benefit from precompiling your rodauth templates:
1051
+
1052
+ plugin :rodauth do
1053
+ # ...
1054
+ end
1055
+ precompile_rodauth_templates
1056
+
1011
1057
  == Upgrading from 0.9.x
1012
1058
 
1013
1059
  To upgrade from 0.9.x to the current version, if you were using
@@ -16,7 +16,8 @@ change_login_notice_flash :: The flash notice to show after a successful
16
16
  change_login_redirect :: Where to redirect after a sucessful login change.
17
17
  change_login_requires_password? :: Whether a password is required when
18
18
  changing logins.
19
- change_login_route :: The route to the change login action.
19
+ change_login_route :: The route to the change login action. Defaults to
20
+ +change-login+.
20
21
 
21
22
  == Auth Methods
22
23
 
@@ -16,7 +16,8 @@ change_password_notice_flash :: The flash notice to show after a successful
16
16
  change_password_redirect :: Where to redirect after a sucessful password change.
17
17
  change_password_requires_password? :: Whether a password is required when
18
18
  changing passwords.
19
- change_password_route :: The route to the change password action.
19
+ change_password_route :: The route to the change password action. Defaults to
20
+ +change-password+.
20
21
 
21
22
  == Auth Methods
22
23
 
@@ -14,7 +14,8 @@ close_account_notice_flash :: The flash notice to show after closing the
14
14
  close_account_redirect :: Where to redirect after closing the account.
15
15
  close_account_requires_password? :: Whether a password is required when
16
16
  closing accounts.
17
- close_account_route :: The route to the close account action.
17
+ close_account_route :: The route to the close account action. Defaults to
18
+ +close-account+.
18
19
  delete_account_on_close? :: Whether to delete the account when closing it,
19
20
  default value is to use +skip_status_checks?+.
20
21
 
@@ -11,7 +11,8 @@ confirm_password_button :: The text to use for the confirm password button.
11
11
  confirm_password_error_flash :: The flash error to show if password confirmation is unsuccessful.
12
12
  confirm_password_notice_flash :: The flash notice to show after password confirmed successful.
13
13
  confirm_password_redirect :: Where to redirect after successful password confirmation. By default, uses <tt>session[:confirm_password_redirect]</tt> if set, allowing an easy way to redirect back to the page requesting password confirmation.
14
- confirm_password_route :: The route to the confirm password form.
14
+ confirm_password_route :: The route to the confirm password form. Defaults to
15
+ +confirm-password+.
15
16
 
16
17
  == Auth Methods
17
18
 
@@ -12,8 +12,8 @@ create_account_error_flash :: The flash error to show for unsuccessful
12
12
  account creation.
13
13
  create_account_notice_flash :: The flash notice to show after successful
14
14
  create_account_redirect :: Where to redirect after creating the account.
15
- create_account_route :: The route to the create account action.
16
- account creation.
15
+ create_account_route :: The route to the create account action. Defaults to
16
+ +create-account+.
17
17
 
18
18
  == Auth Methods
19
19
 
data/doc/lockout.rdoc CHANGED
@@ -47,6 +47,7 @@ unlock_account_request_notice_flash :: The flash notice to display upon successf
47
47
  the unlock account email.
48
48
  unlock_account_request_redirect :: Where to redirect after account unlock email is sent.
49
49
  unlock_account_request_route :: The route to the unlock account request action.
50
+ Defaults to +unlock-account-request+.
50
51
  unlock_account_requires_password? :: Whether a password is required when unlocking accounts,
51
52
  false by default. May want to set to true if not
52
53
  allowing password resets.
data/doc/login.rdoc CHANGED
@@ -14,7 +14,7 @@ login_error_status :: The response status to use when using an invalid
14
14
  login_form_footer :: A message to display after the login form.
15
15
  login_notice_flash :: The flash notice to show after successful login.
16
16
  login_redirect :: Where to redirect after a sucessful login.
17
- login_route :: The route to the login action.
17
+ login_route :: The route to the login action. Defaults to +login+.
18
18
 
19
19
  == Auth Methods
20
20
 
data/doc/logout.rdoc CHANGED
@@ -10,7 +10,7 @@ logout_additional_form_tags :: HTML fragment containing additional form
10
10
  logout_button :: The text to use for the logout button.
11
11
  logout_notice_flash :: The flash notice to show after logout.
12
12
  logout_redirect :: Where to redirect after a logout.
13
- logout_route :: The route to the logout action.
13
+ logout_route :: The route to the logout action. Defaults to +logout+.
14
14
 
15
15
  == Auth Methods
16
16
 
data/doc/otp.rdoc CHANGED
@@ -21,7 +21,7 @@ otp_auth_failures_limit :: The number of allowed OTP authentication failures bef
21
21
  otp_auth_form_footer :: A footer to display at the bottom of the OTP authentication form.
22
22
  otp_auth_label :: The label for the OTP authentication code.
23
23
  otp_auth_param :: The parameter name for the OTP authentication code.
24
- otp_auth_route :: The route to the OTP authentication action.
24
+ otp_auth_route :: The route to the OTP authentication action. Defaults to +otp-auth+.
25
25
  otp_class :: The class to use for OTP authentication (default: ROTP::TOTP)
26
26
  otp_digits :: The number of digits to use in OTP authentication codes (rotp's default is 6).
27
27
  otp_disable_additional_form_tags :: HTML fragment containing additional form tags to use on
@@ -30,7 +30,7 @@ otp_disable_button :: The text to use for button on form to disable OTP authenti
30
30
  otp_disable_error_flash :: The flash error to show if unable to disable OTP authentication.
31
31
  otp_disable_notice_flash :: The flash notice to show after disabling OTP authentication.
32
32
  otp_disable_redirect :: Where to redirect after disabling OTP authentication.
33
- otp_disable_route :: The route to the OTP disable action.
33
+ otp_disable_route :: The route to the OTP disable action. Defaults to +otp-disable+.
34
34
  otp_drift :: The number of seconds the client and server are allowed to drift apart. The
35
35
  default is nil, to not allow drift.
36
36
  otp_invalid_auth_code_message :: The error message to show when an invalid OTP authentication
@@ -61,7 +61,7 @@ otp_setup_error_flash :: The flash error to show if OTP authentication setup was
61
61
  otp_setup_notice_flash :: The flash notice to show if OTP authentication setup was successful.
62
62
  otp_setup_param :: The parameter name used for the OTP secret when setting up OTP authentication.
63
63
  otp_setup_redirect :: Where to redirect after sucessful OTP authentication setup.
64
- otp_setup_route :: The route to the OTP setup action.
64
+ otp_setup_route :: The route to the OTP setup action. Defaults to +otp-setup+.
65
65
 
66
66
  == Auth Methods
67
67
 
@@ -5,6 +5,10 @@ codes. It is usually used as a backup if OTP authentication is not available or
5
5
  has been locked out, but can be used by itself or as a backup to SMS codes. It allows
6
6
  users to view authentication recovery codes as well as regenerate recovery codes.
7
7
 
8
+ Access to recovery codes is limited to authenticated sessions only, so users should
9
+ be recommended to securely store/preserve a subset of these codes prior to any chance
10
+ of them being required due to a missing / lost device.
11
+
8
12
  == Auth Value Methods
9
13
 
10
14
  add_recovery_codes_button :: Text to use for button on form to add recovery codes.
@@ -21,6 +25,7 @@ recovery_auth_additional_form_tags :: HTML fragment containing additional form t
21
25
  recovery_auth_button :: The text to use for the button when authenticating via a recovery code.
22
26
  recovery_auth_redirect :: Where to redirect after authenticating via an recovery code.
23
27
  recovery_auth_route :: The route to the recovery code authentication action.
28
+ Defaults to +recovery-auth+.
24
29
  recovery_codes_added_notice_flash :: The flash notice to show when recovery codes
25
30
  were added.
26
31
  recovery_codes_additional_form_tags :: HTML fragment containing additional form tags when
@@ -34,7 +39,8 @@ recovery_codes_limit :: The number of recovery codes to allow.
34
39
  recovery_codes_param :: The parameter name for the recovery code.
35
40
  recovery_codes_primary? :: Whether recovery codes are the primary second factor, true by
36
41
  default if neither the otp or sms_codes features are enabled.
37
- recovery_codes_route :: The route to the view recovery codes action.
42
+ recovery_codes_route :: The route to the view recovery codes action. Defaults to
43
+ +recovery-codes+.
38
44
  recovery_codes_table :: The table storing the recovery codes.
39
45
  view_recovery_codes_button :: Text for the button to view recovery codes.
40
46
  view_recovery_codes_error_flash :: The flash error to show when viewing recovery codes
@@ -0,0 +1,15 @@
1
+ = New Features
2
+
3
+ * Roda.precompile_rodauth_templates has been added. This method
4
+ allows for precompiling the templates that rodauth uses, which
5
+ allows for memory saving when using a forking webserver that
6
+ preloads the application, and also allows Rodauth to be used
7
+ with an application that uses chroot after loading.
8
+
9
+ = Improvements
10
+
11
+ * If requesting a password reset link more than once, the same
12
+ password reset key will be used. Previously, subsequent
13
+ emails after the first request would contain an invalid key,
14
+ so if the email for the original request was lost, you could
15
+ not generate another key until that key expired.
data/doc/remember.rdoc CHANGED
@@ -37,7 +37,8 @@ remember_period :: The additional time to extend the remember deadline if
37
37
  remember_redirect :: Where to redirect after changing the remember settings.
38
38
  remember_remember_param_value :: The parameter value for switching on remembering.
39
39
  remember_remember_label :: The label for turning on remembering.
40
- remember_route :: The route to the change remember settings action.
40
+ remember_route :: The route to the change remember settings action. Defaults to
41
+ +remember+.
41
42
  remember_table :: The name of the remember keys table.
42
43
  remember_param :: The parameter name to use for the remember password settings
43
44
  choice.
@@ -39,7 +39,9 @@ reset_password_request_button :: The text to use for the reset password request
39
39
  reset_password_request_error_flash :: The flash error to show if not able to send a reset
40
40
  password email.
41
41
  reset_password_request_route :: The route to the reset password request action.
42
- reset_password_route :: The route to the reset password action.
42
+ Defaults to +reset-password-request+.
43
+ reset_password_route :: The route to the reset password action. Defaults to
44
+ +reset-password+.
43
45
  reset_password_session_key :: The key in the session to hold the reset password key temporarily.
44
46
  reset_password_table :: The name of the reset password keys table.
45
47
 
data/doc/sms_codes.rdoc CHANGED
@@ -28,7 +28,7 @@ sms_auth_additional_form_tags :: HTML fragment containing additional form tags w
28
28
  sms_auth_button :: Text to use for button on form to authenticate via SMS.
29
29
  sms_auth_code_length :: The length of SMS authentication codes, 6 by default.
30
30
  sms_auth_redirect :: Where to redirect if SMS authentication is needed.
31
- sms_auth_route :: The route to the SMS authentication action.
31
+ sms_auth_route :: The route to the SMS authentication action. Defaults to +sms-auth+.
32
32
  sms_code_allowed_seconds :: The number of seconds after an SMS authentication is sent until it is no longer valid, 300 seconds by default.
33
33
  sms_code_column :: The column in the +sms_codes_table+ containing the currently valid SMS authentication/confirmation code.
34
34
  sms_code_label :: The label for SMS codes.
@@ -40,13 +40,13 @@ sms_confirm_button :: Text to use for button on form to confirm SMS setup.
40
40
  sms_confirm_code_length :: The length of SMS confirmation codes, 12 by default, as there is no lockout.
41
41
  sms_confirm_notice_flash :: The flash notice to show when SMS authentication setup has been confirmed.
42
42
  sms_confirm_redirect ::Where to redirect after SMS authentication setup has been confirmed.
43
- sms_confirm_route :: The route to the SMS setup confirmation action.
43
+ sms_confirm_route :: The route to the SMS setup confirmation action. Defaults to +sms-confirm+.
44
44
  sms_disable_additional_form_tags :: HTML fragment containing additional form tags when disabling SMS authentication.
45
45
  sms_disable_button :: Text to use for button on form to disable SMS authentication.
46
46
  sms_disable_error_flash :: The flash error to show when disabling SMS authentication fails.
47
47
  sms_disable_notice_flash :: The flash notice to show when SMS authentication has been successfully disabled.
48
48
  sms_disable_redirect :: Where to redirect after SMS authentication has been disabled.
49
- sms_disable_route :: The route to the SMS authentication disable action.
49
+ sms_disable_route :: The route to the SMS authentication disable action. Defaults to +sms-disable+.
50
50
  sms_failure_limit :: The number of failures until SMS authentication is locked out.
51
51
  sms_failures_column :: The column in the +sms_codes_table+ containing the number of SMS authentication failures since the last successful authentication.
52
52
  sms_id_column :: The column in the +sms_codes_table+ containing the account id.
@@ -70,11 +70,11 @@ sms_request_additional_form_tags :: HTML fragment containing additional form tag
70
70
  sms_request_button :: Text to use for button on form to request an SMS authentication code.
71
71
  sms_request_notice_flash :: The flash notice to show when an SMS authentication code is requested.
72
72
  sms_request_redirect :: Where to redirect after requesting an SMS authentication code.
73
- sms_request_route :: The route to the SMS authentication code request action.
73
+ sms_request_route :: The route to the SMS authentication code request action. Defaults to +sms-request+.
74
74
  sms_setup_additional_form_tags :: HTML fragment containing additional form tags when setting up SMS authentication.
75
75
  sms_setup_button :: Text to use for button on form to setup SMS authentication.
76
76
  sms_setup_error_flash :: The flash error to show when setting up SMS authentication fails.
77
- sms_setup_route :: The route to the SMS authentication setup action.
77
+ sms_setup_route :: The route to the SMS authentication setup action. Defaults to +sms-setup+.
78
78
 
79
79
  == Auth Methods
80
80
 
@@ -39,7 +39,9 @@ verify_account_redirect :: Where to redirect after verifying the account.
39
39
  verify_account_resend_error_flash :: The flash error to show if unable to resend a
40
40
  verify account email.
41
41
  verify_account_resend_route :: The route to the verify account resend action.
42
- verify_account_route :: The route to the verify account action.
42
+ Defaults to +verify-account-resend+.
43
+ verify_account_route :: The route to the verify account action. Defaults to
44
+ +verify-account+.
43
45
  verify_account_session_key :: The key in the session to hold the verify account key temporarily.
44
46
  verify_account_table :: The name of the verify account keys table.
45
47
 
data/lib/rodauth.rb CHANGED
@@ -128,6 +128,12 @@ module Rodauth
128
128
  auth_methods meth
129
129
  end
130
130
 
131
+ def loaded_templates(v)
132
+ define_method(:loaded_templates) do
133
+ super().concat(v)
134
+ end
135
+ end
136
+
131
137
  def depends(*deps)
132
138
  dependencies.concat(deps)
133
139
  end
@@ -244,6 +250,22 @@ module Rodauth
244
250
  opts[:rodauths][name]
245
251
  end
246
252
 
253
+ def precompile_rodauth_templates
254
+ instance = allocate
255
+ rodauth = instance.rodauth
256
+
257
+ view_opts = rodauth.send(:loaded_templates).map do |page|
258
+ rodauth.send(:_view_opts, page)
259
+ end
260
+ view_opts << rodauth.send(:button_opts, '', {})
261
+
262
+ view_opts.each do |opts|
263
+ instance.send(:retrieve_template, opts).send(:compiled_method, opts[:locals].keys.sort_by(&:to_s))
264
+ end
265
+
266
+ nil
267
+ end
268
+
247
269
  def freeze
248
270
  if opts[:rodauths]
249
271
  opts[:rodauths].each_value(&:freeze)
@@ -232,10 +232,16 @@ module Rodauth
232
232
  scope.csrf_tag if scope.respond_to?(:csrf_tag)
233
233
  end
234
234
 
235
- def button(value, opts={})
235
+ def button_opts(value, opts)
236
236
  opts = {:locals=>{:value=>value, :opts=>opts}}
237
237
  opts[:path] = template_path('button')
238
- scope.render(opts)
238
+ opts[:cache] = true
239
+ opts[:cache_key] = :rodauth_button
240
+ opts
241
+ end
242
+
243
+ def button(value, opts={})
244
+ scope.render(button_opts(value, opts))
239
245
  end
240
246
 
241
247
  def view(page, title)
@@ -431,6 +437,10 @@ module Rodauth
431
437
  timestamp
432
438
  end
433
439
 
440
+ def loaded_templates
441
+ []
442
+ end
443
+
434
444
  # This is used to avoid race conditions when using the pattern of inserting when
435
445
  # an update affects no rows. In such cases, if a row is inserted between the
436
446
  # update and the insert, the insert will fail with a uniqueness error, but
@@ -499,19 +509,26 @@ module Rodauth
499
509
  update_hash_ds(account, ds, values)
500
510
  end
501
511
 
502
- def _view(meth, page)
512
+ def _view_opts(page)
503
513
  auth_template_path = template_path(page)
504
514
  opts = template_opts.dup
505
515
  opts[:locals] = opts[:locals] ? opts[:locals].dup : {}
506
516
  opts[:locals][:rodauth] = self
517
+ opts[:cache] = true
518
+ opts[:cache_key] = :"rodauth_#{page}"
507
519
 
508
520
  scope.instance_exec do
509
521
  opts = find_template(parse_template_opts(page, opts))
510
522
  unless File.file?(template_path(opts))
511
523
  opts[:path] = auth_template_path
512
524
  end
513
- send(meth, opts)
514
525
  end
526
+
527
+ opts
528
+ end
529
+
530
+ def _view(meth, page)
531
+ scope.send(meth, _view_opts(page))
515
532
  end
516
533
  end
517
534
  end
@@ -6,6 +6,7 @@ module Rodauth
6
6
 
7
7
  notice_flash 'Your login has been changed'
8
8
  error_flash 'There was an error changing your login'
9
+ loaded_templates %w'change-login login-field login-confirm-field password-field'
9
10
  view 'change-login', 'Change Login'
10
11
  after
11
12
  before
@@ -6,6 +6,7 @@ module Rodauth
6
6
 
7
7
  notice_flash 'Your password has been changed'
8
8
  error_flash 'There was an error changing your password'
9
+ loaded_templates %w'change-password password-field password-confirm-field'
9
10
  view 'change-password', 'Change Password'
10
11
  after
11
12
  before
@@ -4,6 +4,7 @@ module Rodauth
4
4
  CloseAccount = Feature.define(:close_account) do
5
5
  notice_flash 'Your account has been closed'
6
6
  error_flash 'There was an error closing your account'
7
+ loaded_templates %w'close-account password-field'
7
8
  view 'close-account', 'Close Account'
8
9
  additional_form_tags
9
10
  button 'Close Account'
@@ -4,6 +4,7 @@ module Rodauth
4
4
  ConfirmPassword = Feature.define(:confirm_password) do
5
5
  notice_flash "Your password has been confirmed"
6
6
  error_flash "There was an error confirming your password"
7
+ loaded_templates %w'confirm-password password-field'
7
8
  view 'confirm-password', 'Confirm Password'
8
9
  additional_form_tags
9
10
  button 'Confirm Password'
@@ -7,6 +7,7 @@ module Rodauth
7
7
  depends :login
8
8
  notice_flash 'Your account has been created'
9
9
  error_flash "There was an error creating your account"
10
+ loaded_templates %w'create-account login-field login-confirm-field password-field password-confirm-field'
10
11
  view 'create-account', 'Create Account'
11
12
  after
12
13
  before
@@ -4,6 +4,7 @@ module Rodauth
4
4
  Lockout = Feature.define(:lockout) do
5
5
  depends :login, :email_base
6
6
 
7
+ loaded_templates %w'unlock-account-request unlock-account password-field unlock-account-email'
7
8
  view 'unlock-account-request', 'Request Account Unlock', 'unlock_account_request'
8
9
  view 'unlock-account', 'Unlock Account', 'unlock_account'
9
10
  before 'unlock_account'
@@ -4,6 +4,7 @@ module Rodauth
4
4
  Login = Feature.define(:login) do
5
5
  notice_flash "You have been logged in"
6
6
  error_flash "There was an error logging in"
7
+ loaded_templates %w'login login-field password-field'
7
8
  view 'login', 'Login'
8
9
  additional_form_tags
9
10
  button 'Login'
@@ -3,6 +3,7 @@
3
3
  module Rodauth
4
4
  Logout = Feature.define(:logout) do
5
5
  notice_flash "You have been logged out"
6
+ loaded_templates %w'logout'
6
7
  view 'logout', 'Logout'
7
8
  additional_form_tags
8
9
  before
@@ -38,6 +38,7 @@ module Rodauth
38
38
  redirect :otp_already_setup
39
39
  redirect :otp_setup
40
40
 
41
+ loaded_templates %w'otp-disable otp-auth otp-setup otp-auth-code-field password-field'
41
42
  view 'otp-disable', 'Disable Two Factor Authentication', 'otp_disable'
42
43
  view 'otp-auth', 'Enter Authentication Code', 'otp_auth'
43
44
  view 'otp-setup', 'Setup Two Factor Authentication', 'otp_setup'
@@ -28,6 +28,7 @@ module Rodauth
28
28
  redirect(:recovery_auth){"#{prefix}/#{recovery_auth_route}"}
29
29
  redirect(:add_recovery_codes){"#{prefix}/#{recovery_codes_route}"}
30
30
 
31
+ loaded_templates %w'add-recovery-codes recovery-auth recovery-codes password-field'
31
32
  view 'add-recovery-codes', 'Authentication Recovery Codes', 'add_recovery_codes'
32
33
  view 'recovery-auth', 'Enter Authentication Recovery Code', 'recovery_auth'
33
34
  view 'recovery-codes', 'View Authentication Recovery Codes', 'recovery_codes'
@@ -6,6 +6,7 @@ module Rodauth
6
6
 
7
7
  notice_flash "Your remember setting has been updated"
8
8
  error_flash "There was an error updating your remember setting"
9
+ loaded_templates %w'remember'
9
10
  view 'remember', 'Change Remember Setting'
10
11
  additional_form_tags
11
12
  button 'Change Remember Setting'
@@ -8,6 +8,7 @@ module Rodauth
8
8
  notice_flash "An email has been sent to you with a link to reset the password for your account", 'reset_password_email_sent'
9
9
  error_flash "There was an error resetting your password"
10
10
  error_flash "There was an error requesting a password reset", 'reset_password_request'
11
+ loaded_templates %w'reset-password password-field password-confirm-field reset-password-email'
11
12
  view 'reset-password', 'Reset Password'
12
13
  additional_form_tags
13
14
  additional_form_tags 'reset_password_request'
@@ -146,6 +147,8 @@ module Rodauth
146
147
  # existing reset password key from the table, or reraise.
147
148
  raise e unless @reset_password_key_value = get_password_reset_key(account_id)
148
149
  end
150
+ else
151
+ @reset_password_key_value = get_password_reset_key(account_id)
149
152
  end
150
153
  end
151
154
  end
@@ -50,6 +50,7 @@ module Rodauth
50
50
  redirect(:sms_needs_setup){"#{prefix}/#{sms_setup_route}"}
51
51
  redirect(:sms_request){"#{prefix}/#{sms_request_route}"}
52
52
 
53
+ loaded_templates %w'sms-auth sms-confirm sms-disable sms-request sms-setup sms-code-field password-field'
53
54
  view 'sms-auth', 'Authenticate via SMS Code', 'sms_auth'
54
55
  view 'sms-confirm', 'Confirm SMS Backup Number', 'sms_confirm'
55
56
  view 'sms-disable', 'Disable Backup SMS Authentication', 'sms_disable'
@@ -8,6 +8,7 @@ module Rodauth
8
8
  error_flash "Unable to resend verify account email", 'verify_account_resend'
9
9
  notice_flash "Your account has been verified"
10
10
  notice_flash "An email has been sent to you with a link to verify your account", 'verify_account_email_sent'
11
+ loaded_templates %w'verify-account verify-account-resend verify-account-email'
11
12
  view 'verify-account', 'Verify Account'
12
13
  view 'verify-account-resend', 'Resend Verification Email', 'resend_verify_account'
13
14
  additional_form_tags
@@ -1,7 +1,7 @@
1
1
  # frozen-string-literal: true
2
2
 
3
3
  module Rodauth
4
- VERSION = '1.8.0'.freeze
4
+ VERSION = '1.9.0'.freeze
5
5
 
6
6
  def self.version
7
7
  VERSION
data/spec/login_spec.rb CHANGED
@@ -133,7 +133,7 @@ describe 'Rodauth login feature' do
133
133
  r.rodauth
134
134
  end
135
135
  next unless session[:login_email] =~ /example/
136
- r.get('foo/:email'){|e| "Logged In: #{e}"}
136
+ r.get('foo', :email){|e| "Logged In: #{e}"}
137
137
  end
138
138
  app.plugin :render, :views=>'spec/views', :engine=>'str'
139
139
 
@@ -158,7 +158,7 @@ describe 'Rodauth password expiration feature' do
158
158
  roda do |r|
159
159
  r.rodauth
160
160
  rodauth.require_current_password
161
- r.get("expire/:d"){|d| session[:password_changed_at] = Time.now.to_i - d.to_i; r.redirect '/'}
161
+ r.get("expire", :d){|d| session[:password_changed_at] = Time.now.to_i - d.to_i; r.redirect '/'}
162
162
  r.root{view :content=>""}
163
163
  end
164
164
 
@@ -23,6 +23,10 @@ describe 'Rodauth reset_password feature' do
23
23
  visit link[0...-1]
24
24
  page.find('#error_flash').text.must_equal "invalid password reset key"
25
25
 
26
+ login(:pass=>'01234567', :visit=>false)
27
+ click_button 'Request Password Reset'
28
+ email_link(/(\/reset-password\?key=.+)$/).must_equal link
29
+
26
30
  visit link
27
31
  page.title.must_equal 'Reset Password'
28
32
 
data/spec/rodauth_spec.rb CHANGED
@@ -25,6 +25,19 @@ describe 'Rodauth' do
25
25
  page.title.must_equal 'Foo Login'
26
26
  end
27
27
 
28
+ it "should work without preloading the templates" do
29
+ @no_precompile = true
30
+ rodauth do
31
+ enable :login
32
+ end
33
+ roda do |r|
34
+ r.rodauth
35
+ end
36
+
37
+ visit '/login'
38
+ page.title.must_equal 'Login'
39
+ end
40
+
28
41
  it "should require login to perform certain actions" do
29
42
  rodauth do
30
43
  enable :login, :change_password, :change_login, :close_account
data/spec/spec_helper.rb CHANGED
@@ -42,7 +42,8 @@ require 'tilt/string'
42
42
 
43
43
  db_url = ENV['RODAUTH_SPEC_DB'] || 'postgres:///?user=rodauth_test&password=rodauth_test'
44
44
  DB = Sequel.connect(db_url, :identifier_mangling=>false)
45
- DB.extension(:freeze_datasets)
45
+ DB.extension :freeze_datasets, :date_arithmetic
46
+ DB.freeze
46
47
  puts "using #{DB.database_type}"
47
48
 
48
49
  #DB.loggers << Logger.new($stdout)
@@ -98,6 +99,9 @@ class Minitest::HooksSpec
98
99
  jwt = type == :jwt || type == :jwt_html
99
100
 
100
101
  app = Class.new(jwt_only ? JsonBase : Base)
102
+ app.opts[:unsupported_block_result] = :raise
103
+ app.opts[:unsupported_matcher] = :raise
104
+ app.opts[:verbatim_string_matcher] = true
101
105
  rodauth_block = @rodauth_block
102
106
  opts = type.is_a?(Hash) ? type : {}
103
107
 
@@ -116,6 +120,7 @@ class Minitest::HooksSpec
116
120
  instance_exec(&rodauth_block)
117
121
  end
118
122
  app.route(&block)
123
+ app.precompile_rodauth_templates unless @no_precompile || jwt_only
119
124
  app.freeze unless @no_freeze
120
125
  self.app = app
121
126
  end
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: 1.8.0
4
+ version: 1.9.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: 2017-01-06 00:00:00.000000000 Z
11
+ date: 2017-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -235,6 +235,7 @@ extra_rdoc_files:
235
235
  - doc/release_notes/1.6.0.txt
236
236
  - doc/release_notes/1.7.0.txt
237
237
  - doc/release_notes/1.8.0.txt
238
+ - doc/release_notes/1.9.0.txt
238
239
  files:
239
240
  - CHANGELOG
240
241
  - MIT-LICENSE
@@ -269,6 +270,7 @@ files:
269
270
  - doc/release_notes/1.6.0.txt
270
271
  - doc/release_notes/1.7.0.txt
271
272
  - doc/release_notes/1.8.0.txt
273
+ - doc/release_notes/1.9.0.txt
272
274
  - doc/remember.rdoc
273
275
  - doc/reset_password.rdoc
274
276
  - doc/session_expiration.rdoc