rodauth 1.16.0 → 1.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +4 -0
- data/README.rdoc +50 -3
- data/doc/base.rdoc +9 -4
- data/doc/create_account.rdoc +1 -1
- data/doc/release_notes/1.17.0.txt +23 -0
- data/lib/rodauth.rb +16 -3
- data/lib/rodauth/features/base.rb +16 -3
- data/lib/rodauth/version.rb +16 -1
- data/spec/change_password_spec.rb +0 -1
- data/spec/password_expiration_spec.rb +1 -1
- data/spec/rodauth_spec.rb +10 -2
- data/spec/spec_helper.rb +31 -2
- data/spec/verify_login_change_spec.rb +1 -1
- data/templates/reset-password-request.str +1 -1
- data/templates/unlock-account-request.str +1 -1
- data/templates/verify-account-resend.str +1 -1
- metadata +35 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1798ddc466406349db5af1aade5b74cc46996c13c2fa67deaba0b4dd868f5a8
|
4
|
+
data.tar.gz: fc4232e2eefd30d947285667355fe67bfcd3cd8bb8271d5137f812da525b7ff2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb68af1641b0c62f21ac2c0dca6fff2384e4fd45e6110e0bf4ef7ebf7d037475aa0a6f2caa84218303c49be23fc0d05a0735e484374bc9bb4b229967cd9574b2
|
7
|
+
data.tar.gz: e2d63f243e0ebfded4b2145cec4b2ae6c9f27980e4a41c9de2b2726aeb22fa4e488a1ae68defb33adfe724666aa6d41649694d06aec06b7de8fd6abe85b57304
|
data/CHANGELOG
CHANGED
data/README.rdoc
CHANGED
@@ -59,11 +59,15 @@ There are some dependencies that Rodauth uses by default, but are
|
|
59
59
|
development dependencies instead of runtime dependencies in the
|
60
60
|
gem as it is possible to run without them:
|
61
61
|
|
62
|
-
tilt
|
62
|
+
tilt :: Used by all features unless in JSON API only mode.
|
63
|
+
rack_csrf :: Used by all features unless in JSON API only mode
|
64
|
+
or the :csrf=>false|:route_csrf option is used when
|
65
|
+
loading the Rodauth plugin.
|
63
66
|
bcrypt :: Used by default for password matching, can be skipped
|
64
67
|
if password_match? is overridden for custom authentication.
|
65
68
|
mail :: Used by default for mailing in the reset password, verify
|
66
|
-
account,
|
69
|
+
account, verify_login_change, change_password_notify, and
|
70
|
+
lockout features.
|
67
71
|
rotp, rqrcode :: Used by the otp feature
|
68
72
|
jwt :: Used by the jwt feature
|
69
73
|
|
@@ -545,6 +549,32 @@ One thing to notice in the above migrations is that Rodauth uses additional
|
|
545
549
|
tables for additional features, instead of additional columns in a single
|
546
550
|
table.
|
547
551
|
|
552
|
+
=== Locking Down (PostgreSQL only)
|
553
|
+
|
554
|
+
After running the migrations, you can increase security slightly by making
|
555
|
+
it not possible for the +ph+ account to login to the database directly.
|
556
|
+
This can be accomplished by modifying the +pg_hba.conf+ file. You can also
|
557
|
+
consider restricting access using GRANT/REVOKE.
|
558
|
+
|
559
|
+
You can restrict access to the database itself to just the +app+ account. You
|
560
|
+
can run this using the +app+ account, since that account owns the database:
|
561
|
+
|
562
|
+
GRANT ALL ON DATABASE ${DATABASE_NAME} TO ${DATABASE_NAME};
|
563
|
+
REVOKE ALL ON DATABASE ${DATABASE_NAME} FROM public;
|
564
|
+
|
565
|
+
You can also restrict access to the public schema (this is not needed if you
|
566
|
+
are using a custom schema). Note that by default, the database superuser
|
567
|
+
owns the public schema, so you have to run this as the database superuser
|
568
|
+
account (generally +postgres+):
|
569
|
+
|
570
|
+
GRANT ALL ON SCHEMA public TO ${DATABASE_NAME};
|
571
|
+
GRANT USAGE ON SCHEMA public TO ${DATABASE_NAME}_password;
|
572
|
+
REVOKE ALL ON SCHEMA public FROM public;
|
573
|
+
|
574
|
+
If you are using MySQL or Microsoft SQL Server, please consult their
|
575
|
+
documentation for how to restrict access so that the +ph+ account cannot
|
576
|
+
login directly.
|
577
|
+
|
548
578
|
== Usage
|
549
579
|
|
550
580
|
=== Basic Usage
|
@@ -588,7 +618,7 @@ response :: RodaResponse instance
|
|
588
618
|
scope :: Roda instance
|
589
619
|
session :: session hash
|
590
620
|
flash :: flash message hash
|
591
|
-
account :: account
|
621
|
+
account :: account hash (if set by an earlier Rodauth method)
|
592
622
|
|
593
623
|
So if you want to log the IP address for the user during login:
|
594
624
|
|
@@ -625,6 +655,23 @@ overriding for all behavior, using any information from the request:
|
|
625
655
|
By allowing every configuration method to take a block, Rodauth
|
626
656
|
should be flexible enough to integrate into most legacy systems.
|
627
657
|
|
658
|
+
=== Plugin Options
|
659
|
+
|
660
|
+
When loading the rodauth plugin, you can also pass an options hash,
|
661
|
+
which configures which dependent plugins should be loaded. Options:
|
662
|
+
|
663
|
+
:csrf :: Set to +false+ to not load a csrf plugin. Set to +:route_csrf+
|
664
|
+
to use the route_csrf plugin instead of the csrf plugin. It is
|
665
|
+
recommended to set the +:route_csrf+ option as that allows
|
666
|
+
for more secure request-specific CSRF tokens.
|
667
|
+
:flash :: Set to +false+ to not load the flash plugin
|
668
|
+
:json :: Set to +true+ to load the json and json_parser plugins. Set
|
669
|
+
to +:only+ to only load those plugins and not any other plugins.
|
670
|
+
Note that if you are enabling features that send email, you
|
671
|
+
still need to load the render plugin manually.
|
672
|
+
:name :: Provide a name for the given Rodauth configuration, used to
|
673
|
+
support multiple Rodauth configurations in a given Roda application.
|
674
|
+
|
628
675
|
=== Feature Documentation
|
629
676
|
|
630
677
|
The options/methods for the supported features are listed on a
|
data/doc/base.rdoc
CHANGED
@@ -85,7 +85,12 @@ use_date_arithmetic? :: Whether the date_arithmetic extension should be loaded i
|
|
85
85
|
the database. Defaults to whether deadline values should
|
86
86
|
be set.
|
87
87
|
use_database_authentication_functions? :: Whether to use functions to do authentication.
|
88
|
-
True by default on PostgreSQL,
|
88
|
+
True by default on PostgreSQL, MySQL, and
|
89
|
+
Microsoft SQL Server, false otherwise.
|
90
|
+
use_request_specific_csrf_tokens? :: Whether to use request-specific CSRF tokens.
|
91
|
+
True if the :csrf=>:route_csrf option is used when
|
92
|
+
loading the plugin, and the Roda route_csrf plugin
|
93
|
+
is configured to use request-specific CSRF tokens.
|
89
94
|
|
90
95
|
== Auth Methods
|
91
96
|
|
@@ -97,9 +102,9 @@ before_login :: Run arbitrary code after password has been checked, but
|
|
97
102
|
before_login_attempt :: Run arbitrary code after an account has been
|
98
103
|
located, but before the password has been checked.
|
99
104
|
before_rodauth :: Run arbitrary code before handling any rodauth route.
|
100
|
-
account_from_login(login) :: Retrieve the account
|
105
|
+
account_from_login(login) :: Retrieve the account hash related to the
|
101
106
|
given login or nil if no login matches.
|
102
|
-
account_from_session :: Retrieve the account
|
107
|
+
account_from_session :: Retrieve the account hash related to the currently
|
103
108
|
logged in session.
|
104
109
|
account_id :: The primary key value of the current account
|
105
110
|
account_session_value :: The primary value of the account currently stored in the
|
@@ -110,7 +115,7 @@ authenticated? :: Whether the user has been authenticated. If 2 factor authentic
|
|
110
115
|
has not been enabled for the account, this is true only if both
|
111
116
|
factors have been authenticated.
|
112
117
|
clear_session :: Clears the current session.
|
113
|
-
csrf_tag :: The HTML fragment containing the CSRF tag to use, if any.
|
118
|
+
csrf_tag(path=request.path) :: The HTML fragment containing the CSRF tag to use, if any.
|
114
119
|
function_name(name) :: The name of the database function to call. It's passed either
|
115
120
|
:rodauth_get_salt or :rodauth_valid_password_hash.
|
116
121
|
logged_in? :: Whether there is an account currently logged in.
|
data/doc/create_account.rdoc
CHANGED
@@ -29,7 +29,7 @@ create_account_autologin? :: Whether to autologin the user upon
|
|
29
29
|
create_account_link :: HTML fragment to display with a link to the create
|
30
30
|
account form.
|
31
31
|
create_account_view :: The HTML to use for the create account form.
|
32
|
-
new_account(login) :: Instantiate a new account
|
32
|
+
new_account(login) :: Instantiate a new account hash for the
|
33
33
|
given login, without saving it.
|
34
34
|
save_account :: Insert the account into the database, or return nil/false if that
|
35
35
|
was not successful.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
= Improvements
|
2
|
+
|
3
|
+
* Support has been added for using Roda's route_csrf plugin with
|
4
|
+
request-specific CSRF tokens. When loading the Rodauth into
|
5
|
+
your Roda app, specify the :csrf=>:route_csrf plugin option
|
6
|
+
so that Rodauth will load the route_csrf plugin instead of
|
7
|
+
the csrf plugin.
|
8
|
+
|
9
|
+
* The use_request_specific_csrf_tokens? configuration option
|
10
|
+
has been added, it defaults to true when the the
|
11
|
+
:csrf=>:route_csrf option is used when loading the plugin.
|
12
|
+
|
13
|
+
* If you have custom templates for the reset password request,
|
14
|
+
unlock account request, or verify account resend link
|
15
|
+
request, you will have to update them to use the new
|
16
|
+
request-specific CSRF token feature.
|
17
|
+
|
18
|
+
= Backwards Compatibility
|
19
|
+
|
20
|
+
* The csrf_tag configuration method now accepts the path as
|
21
|
+
an optional argument, previously it accepted no arguments.
|
22
|
+
The optional argument defaults to the path of the current
|
23
|
+
request.
|
data/lib/rodauth.rb
CHANGED
@@ -4,15 +4,27 @@ require 'securerandom'
|
|
4
4
|
|
5
5
|
module Rodauth
|
6
6
|
def self.load_dependencies(app, opts={})
|
7
|
-
|
7
|
+
json_opt = opts.fetch(:json, app.opts[:rodauth_json])
|
8
|
+
if json_opt
|
8
9
|
app.plugin :json
|
9
10
|
app.plugin :json_parser
|
10
11
|
end
|
11
12
|
|
12
|
-
unless
|
13
|
+
unless json_opt == :only
|
13
14
|
require 'tilt/string'
|
14
15
|
app.plugin :render
|
15
|
-
|
16
|
+
|
17
|
+
case opts.fetch(:csrf, app.opts[:rodauth_route_csrf])
|
18
|
+
when false
|
19
|
+
# nothing
|
20
|
+
when :route_csrf
|
21
|
+
# :nocov:
|
22
|
+
app.plugin :route_csrf
|
23
|
+
# :nocov:
|
24
|
+
else
|
25
|
+
app.plugin :csrf
|
26
|
+
end
|
27
|
+
|
16
28
|
app.plugin :flash unless opts[:flash] == false
|
17
29
|
app.plugin :h
|
18
30
|
end
|
@@ -20,6 +32,7 @@ module Rodauth
|
|
20
32
|
|
21
33
|
def self.configure(app, opts={}, &block)
|
22
34
|
app.opts[:rodauth_json] = opts.fetch(:json, app.opts[:rodauth_json])
|
35
|
+
app.opts[:rodauth_csrf] = opts.fetch(:csrf, app.opts[:rodauth_route_csrf])
|
23
36
|
auth_class = (app.opts[:rodauths] ||= {})[opts[:name]] ||= Class.new(Auth)
|
24
37
|
if !auth_class.roda_class
|
25
38
|
auth_class.roda_class = app
|
@@ -53,7 +53,8 @@ module Rodauth
|
|
53
53
|
:require_login_redirect,
|
54
54
|
:set_deadline_values?,
|
55
55
|
:use_date_arithmetic?,
|
56
|
-
:use_database_authentication_functions
|
56
|
+
:use_database_authentication_functions?,
|
57
|
+
:use_request_specific_csrf_tokens?
|
57
58
|
)
|
58
59
|
|
59
60
|
auth_methods(
|
@@ -231,8 +232,16 @@ module Rodauth
|
|
231
232
|
@account = _account_from_session
|
232
233
|
end
|
233
234
|
|
234
|
-
def csrf_tag
|
235
|
-
|
235
|
+
def csrf_tag(path=request.path)
|
236
|
+
return unless scope.respond_to?(:csrf_tag)
|
237
|
+
|
238
|
+
if use_request_specific_csrf_tokens?
|
239
|
+
# :nocov:
|
240
|
+
scope.csrf_tag(path)
|
241
|
+
# :nocov:
|
242
|
+
else
|
243
|
+
scope.csrf_tag
|
244
|
+
end
|
236
245
|
end
|
237
246
|
|
238
247
|
def button_opts(value, opts)
|
@@ -379,6 +388,10 @@ module Rodauth
|
|
379
388
|
end
|
380
389
|
end
|
381
390
|
|
391
|
+
def use_request_specific_csrf_tokens?
|
392
|
+
scope.opts[:rodauth_csrf] == :route_csrf && scope.use_request_specific_csrf_tokens?
|
393
|
+
end
|
394
|
+
|
382
395
|
def function_name(name)
|
383
396
|
if db.database_type == :mssql
|
384
397
|
# :nocov:
|
data/lib/rodauth/version.rb
CHANGED
@@ -1,7 +1,22 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
3
|
module Rodauth
|
4
|
-
|
4
|
+
# The major version of Rodauth, updated only for major changes that are
|
5
|
+
# likely to require modification to apps using Rodauth.
|
6
|
+
MAJOR = 1
|
7
|
+
|
8
|
+
# The minor version of Rodauth, updated for new feature releases of Rodauth.
|
9
|
+
MINOR = 17
|
10
|
+
|
11
|
+
# The patch version of Rodauth, updated only for bug fixes from the last
|
12
|
+
# feature release.
|
13
|
+
TINY = 0
|
14
|
+
|
15
|
+
# The full version of Rodauth as a string
|
16
|
+
VERSION = "#{MAJOR}.#{MINOR}.#{TINY}".freeze
|
17
|
+
|
18
|
+
# The full version of Rodauth as a number (1.17.0 => 11700)
|
19
|
+
VERSION_NUMBER = MAJOR*10000 + MINOR*100 + TINY
|
5
20
|
|
6
21
|
def self.version
|
7
22
|
VERSION
|
@@ -92,7 +92,6 @@ describe 'Rodauth change_password feature' do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
it "should support invalid_previous_password_message" do
|
95
|
-
require_password = true
|
96
95
|
rodauth do
|
97
96
|
enable :login, :logout, :change_password
|
98
97
|
invalid_previous_password_message "Previous password not correct"
|
@@ -152,7 +152,7 @@ describe 'Rodauth password expiration feature' do
|
|
152
152
|
rodauth do
|
153
153
|
enable :login, :change_password, :password_expiration
|
154
154
|
password_expiration_default true
|
155
|
-
allow_password_change_after
|
155
|
+
allow_password_change_after(-1000)
|
156
156
|
change_password_requires_password? false
|
157
157
|
require_password_change_after 3600
|
158
158
|
end
|
data/spec/rodauth_spec.rb
CHANGED
@@ -184,7 +184,7 @@ describe 'Rodauth' do
|
|
184
184
|
|
185
185
|
it "should support multiple rodauth configurations in an app" do
|
186
186
|
app = Class.new(Base)
|
187
|
-
app.plugin(:rodauth) do
|
187
|
+
app.plugin(:rodauth, rodauth_opts) do
|
188
188
|
enable :login
|
189
189
|
if ENV['RODAUTH_SEPARATE_SCHEMA']
|
190
190
|
password_hash_table Sequel[:rodauth_test_password][:account_password_hashes]
|
@@ -193,10 +193,18 @@ describe 'Rodauth' do
|
|
193
193
|
end
|
194
194
|
end
|
195
195
|
end
|
196
|
-
app.plugin(:rodauth, :name=>:r2) do
|
196
|
+
app.plugin(:rodauth, rodauth_opts.merge(:name=>:r2)) do
|
197
197
|
enable :logout
|
198
198
|
end
|
199
|
+
|
200
|
+
if Minitest::HooksSpec::USE_ROUTE_CSRF
|
201
|
+
app.plugin :route_csrf, Minitest::HooksSpec::ROUTE_CSRF_OPTS
|
202
|
+
end
|
203
|
+
|
199
204
|
app.route do |r|
|
205
|
+
if Minitest::HooksSpec::USE_ROUTE_CSRF
|
206
|
+
check_csrf!
|
207
|
+
end
|
200
208
|
r.on 'r1' do
|
201
209
|
r.rodauth
|
202
210
|
'r1'
|
data/spec/spec_helper.rb
CHANGED
@@ -2,7 +2,7 @@ $: << 'lib'
|
|
2
2
|
|
3
3
|
if ENV['WARNING']
|
4
4
|
require 'warning'
|
5
|
-
Warning.ignore([:missing_ivar, :missing_gvar, :fixnum])
|
5
|
+
Warning.ignore([:missing_ivar, :missing_gvar, :fixnum, :not_reached])
|
6
6
|
#Warning.ignore(/warning: URI\.escape is obsolete\n\z/)
|
7
7
|
Warning.ignore(:method_redefined, File.dirname(File.dirname(__FILE__)))
|
8
8
|
end
|
@@ -29,6 +29,8 @@ require 'capybara'
|
|
29
29
|
require 'capybara/dsl'
|
30
30
|
require 'rack/test'
|
31
31
|
require 'stringio'
|
32
|
+
|
33
|
+
ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
|
32
34
|
gem 'minitest'
|
33
35
|
require 'minitest/autorun'
|
34
36
|
require 'minitest/hooks/default'
|
@@ -83,6 +85,17 @@ JsonBase.plugin(:not_found){raise "path #{request.path_info} not found"}
|
|
83
85
|
class Minitest::HooksSpec
|
84
86
|
include Rack::Test::Methods
|
85
87
|
include Capybara::DSL
|
88
|
+
|
89
|
+
case ENV['RODA_ROUTE_CSRF']
|
90
|
+
when '1'
|
91
|
+
USE_ROUTE_CSRF = true
|
92
|
+
ROUTE_CSRF_OPTS = {}
|
93
|
+
when '2'
|
94
|
+
USE_ROUTE_CSRF = true
|
95
|
+
ROUTE_CSRF_OPTS = {:require_request_specific_tokens=>false}
|
96
|
+
else
|
97
|
+
USE_ROUTE_CSRF = false
|
98
|
+
end
|
86
99
|
|
87
100
|
attr_reader :app
|
88
101
|
|
@@ -98,6 +111,14 @@ class Minitest::HooksSpec
|
|
98
111
|
@rodauth_block = block
|
99
112
|
end
|
100
113
|
|
114
|
+
def rodauth_opts(type={})
|
115
|
+
opts = type.is_a?(Hash) ? type : {}
|
116
|
+
if USE_ROUTE_CSRF && !opts.has_key?(:csrf)
|
117
|
+
opts[:csrf] = :route_csrf
|
118
|
+
end
|
119
|
+
opts
|
120
|
+
end
|
121
|
+
|
101
122
|
def roda(type=nil, &block)
|
102
123
|
jwt_only = type == :jwt
|
103
124
|
jwt = type == :jwt || type == :jwt_html
|
@@ -111,7 +132,7 @@ class Minitest::HooksSpec
|
|
111
132
|
app.opts[:unsupported_matcher] = :raise
|
112
133
|
app.opts[:verbatim_string_matcher] = true
|
113
134
|
rodauth_block = @rodauth_block
|
114
|
-
opts = type
|
135
|
+
opts = rodauth_opts(type)
|
115
136
|
|
116
137
|
if jwt
|
117
138
|
opts[:json] = jwt_only ? :only : true
|
@@ -133,6 +154,14 @@ class Minitest::HooksSpec
|
|
133
154
|
end
|
134
155
|
instance_exec(&rodauth_block)
|
135
156
|
end
|
157
|
+
if USE_ROUTE_CSRF && !jwt_only && opts[:csrf] != false
|
158
|
+
app.plugin(:route_csrf, ROUTE_CSRF_OPTS)
|
159
|
+
orig_block = block
|
160
|
+
block = proc do |r|
|
161
|
+
check_csrf!
|
162
|
+
instance_exec(r, &orig_block)
|
163
|
+
end
|
164
|
+
end
|
136
165
|
app.route(&block)
|
137
166
|
app.precompile_rodauth_templates unless @no_precompile || jwt_only
|
138
167
|
app.freeze unless @no_freeze
|
@@ -102,7 +102,7 @@ describe 'Rodauth verify_login_change feature' do
|
|
102
102
|
fill_in 'Login', :with=>'foo@example2.com'
|
103
103
|
fill_in 'Confirm Login', :with=>'foo@example2.com'
|
104
104
|
click_button 'Change Login'
|
105
|
-
|
105
|
+
email_link(/(\/verify-login-change\?key=.+)$/, 'foo@example2.com')
|
106
106
|
page.find('#notice_flash').text.must_equal "An email has been sent to you with a link to verify your login change"
|
107
107
|
|
108
108
|
unique = lambda{DB[:account_login_change_keys].update(:login=>'foo@example3.com'); true}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<form action="#{rodauth.prefix}/#{rodauth.reset_password_request_route}" method="post" class="rodauth form-horizontal" role="form" id="reset-password-request-form">
|
2
2
|
#{rodauth.reset_password_request_additional_form_tags}
|
3
|
-
#{rodauth.csrf_tag}
|
3
|
+
#{rodauth.csrf_tag("#{rodauth.prefix}/#{rodauth.reset_password_request_route}")}
|
4
4
|
<p>If you have forgotten your password, you can request a password reset: </p>
|
5
5
|
#{(login = rodauth.param_or_nil(rodauth.login_param)) ? "<input type=\"hidden\" name=\"#{rodauth.login_param}\" value=\"#{h login}\"/>" : rodauth.render('login-field')}
|
6
6
|
#{rodauth.button(rodauth.reset_password_request_button)}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<form action="#{rodauth.prefix}/#{rodauth.unlock_account_request_route}" method="post" class="rodauth form-horizontal" role="form" id="unlock-account-request-form">
|
2
2
|
#{rodauth.unlock_account_request_additional_form_tags}
|
3
|
-
#{rodauth.csrf_tag}
|
3
|
+
#{rodauth.csrf_tag("#{rodauth.prefix}/#{rodauth.unlock_account_request_route}")}
|
4
4
|
<input type="hidden" name="#{rodauth.login_param}" value="#{h rodauth.param(rodauth.login_param)}"/>
|
5
5
|
This account is currently locked out. You can request that the account be unlocked:
|
6
6
|
<input type="submit" class="btn btn-primary inline" value="#{rodauth.unlock_account_request_button}"/>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<form action="#{rodauth.prefix}/#{rodauth.verify_account_resend_route}" method="post" class="rodauth form-horizontal" role="form" id="verify-account-resend-form">
|
2
2
|
#{rodauth.verify_account_resend_additional_form_tags}
|
3
|
-
#{rodauth.csrf_tag}
|
3
|
+
#{rodauth.csrf_tag("#{rodauth.prefix}/#{rodauth.verify_account_resend_route}")}
|
4
4
|
<p>If you no longer have the email to verify the account, you can request that it be resent to you:</p>
|
5
5
|
#{(login = rodauth.param_or_nil(rodauth.login_param)) ? "<input type=\"hidden\" name=\"#{rodauth.login_param}\" value=\"#{h login}\"/>" : rodauth.render('login-field')}
|
6
6
|
#{rodauth.button(rodauth.verify_account_resend_button)}
|
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.
|
4
|
+
version: 1.17.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: 2018-
|
11
|
+
date: 2018-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -196,42 +196,50 @@ extra_rdoc_files:
|
|
196
196
|
- README.rdoc
|
197
197
|
- CHANGELOG
|
198
198
|
- MIT-LICENSE
|
199
|
+
- doc/change_password_notify.rdoc
|
200
|
+
- doc/account_expiration.rdoc
|
199
201
|
- doc/base.rdoc
|
200
|
-
- doc/
|
201
|
-
- doc/logout.rdoc
|
202
|
+
- doc/change_login.rdoc
|
202
203
|
- doc/change_password.rdoc
|
203
|
-
- doc/
|
204
|
-
- doc/remember.rdoc
|
205
|
-
- doc/create_account.rdoc
|
204
|
+
- doc/confirm_password.rdoc
|
206
205
|
- doc/close_account.rdoc
|
207
|
-
- doc/
|
206
|
+
- doc/http_basic_auth.rdoc
|
207
|
+
- doc/create_account.rdoc
|
208
|
+
- doc/email_base.rdoc
|
209
|
+
- doc/internals.rdoc
|
210
|
+
- doc/disallow_common_passwords.rdoc
|
211
|
+
- doc/disallow_password_reuse.rdoc
|
212
|
+
- doc/password_complexity.rdoc
|
213
|
+
- doc/jwt.rdoc
|
208
214
|
- doc/lockout.rdoc
|
215
|
+
- doc/login.rdoc
|
216
|
+
- doc/logout.rdoc
|
209
217
|
- doc/otp.rdoc
|
210
|
-
- doc/
|
211
|
-
- doc/
|
212
|
-
- doc/disallow_password_reuse.rdoc
|
218
|
+
- doc/login_password_requirements_base.rdoc
|
219
|
+
- doc/verify_change_login.rdoc
|
213
220
|
- doc/password_expiration.rdoc
|
214
|
-
- doc/
|
215
|
-
- doc/single_session.rdoc
|
221
|
+
- doc/password_grace_period.rdoc
|
216
222
|
- doc/recovery_codes.rdoc
|
223
|
+
- doc/remember.rdoc
|
224
|
+
- doc/reset_password.rdoc
|
225
|
+
- doc/session_expiration.rdoc
|
226
|
+
- doc/single_session.rdoc
|
217
227
|
- doc/sms_codes.rdoc
|
218
|
-
- doc/email_base.rdoc
|
219
228
|
- doc/two_factor_base.rdoc
|
220
|
-
- doc/jwt.rdoc
|
221
|
-
- doc/password_grace_period.rdoc
|
222
|
-
- doc/session_expiration.rdoc
|
223
|
-
- doc/login_password_requirements_base.rdoc
|
224
|
-
- doc/verify_account_grace_period.rdoc
|
225
|
-
- doc/confirm_password.rdoc
|
226
|
-
- doc/verify_change_login.rdoc
|
227
229
|
- doc/update_password_hash.rdoc
|
228
|
-
- doc/
|
230
|
+
- doc/verify_account.rdoc
|
231
|
+
- doc/verify_account_grace_period.rdoc
|
229
232
|
- doc/verify_login_change.rdoc
|
230
|
-
- doc/
|
231
|
-
- doc/change_password_notify.rdoc
|
232
|
-
- doc/disallow_common_passwords.rdoc
|
233
|
+
- doc/release_notes/1.17.0.txt
|
233
234
|
- doc/release_notes/1.0.0.txt
|
234
235
|
- doc/release_notes/1.1.0.txt
|
236
|
+
- doc/release_notes/1.10.0.txt
|
237
|
+
- doc/release_notes/1.11.0.txt
|
238
|
+
- doc/release_notes/1.12.0.txt
|
239
|
+
- doc/release_notes/1.13.0.txt
|
240
|
+
- doc/release_notes/1.14.0.txt
|
241
|
+
- doc/release_notes/1.15.0.txt
|
242
|
+
- doc/release_notes/1.16.0.txt
|
235
243
|
- doc/release_notes/1.2.0.txt
|
236
244
|
- doc/release_notes/1.3.0.txt
|
237
245
|
- doc/release_notes/1.4.0.txt
|
@@ -240,13 +248,6 @@ extra_rdoc_files:
|
|
240
248
|
- doc/release_notes/1.7.0.txt
|
241
249
|
- doc/release_notes/1.8.0.txt
|
242
250
|
- doc/release_notes/1.9.0.txt
|
243
|
-
- doc/release_notes/1.10.0.txt
|
244
|
-
- doc/release_notes/1.11.0.txt
|
245
|
-
- doc/release_notes/1.12.0.txt
|
246
|
-
- doc/release_notes/1.13.0.txt
|
247
|
-
- doc/release_notes/1.14.0.txt
|
248
|
-
- doc/release_notes/1.15.0.txt
|
249
|
-
- doc/release_notes/1.16.0.txt
|
250
251
|
files:
|
251
252
|
- CHANGELOG
|
252
253
|
- MIT-LICENSE
|
@@ -285,6 +286,7 @@ files:
|
|
285
286
|
- doc/release_notes/1.14.0.txt
|
286
287
|
- doc/release_notes/1.15.0.txt
|
287
288
|
- doc/release_notes/1.16.0.txt
|
289
|
+
- doc/release_notes/1.17.0.txt
|
288
290
|
- doc/release_notes/1.2.0.txt
|
289
291
|
- doc/release_notes/1.3.0.txt
|
290
292
|
- doc/release_notes/1.4.0.txt
|
@@ -442,7 +444,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
442
444
|
version: '0'
|
443
445
|
requirements: []
|
444
446
|
rubyforge_project:
|
445
|
-
rubygems_version: 2.7.
|
447
|
+
rubygems_version: 2.7.6
|
446
448
|
signing_key:
|
447
449
|
specification_version: 4
|
448
450
|
summary: Authentication and Account Management Framework for Rack Applications
|