rodauth 0.10.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +146 -0
- data/README.rdoc +644 -220
- data/Rakefile +99 -11
- data/doc/account_expiration.rdoc +55 -0
- data/doc/base.rdoc +104 -0
- data/doc/change_login.rdoc +29 -0
- data/doc/change_password.rdoc +26 -0
- data/doc/close_account.rdoc +31 -0
- data/doc/confirm_password.rdoc +22 -0
- data/doc/create_account.rdoc +34 -0
- data/doc/disallow_password_reuse.rdoc +37 -0
- data/doc/email_base.rdoc +19 -0
- data/doc/jwt.rdoc +35 -0
- data/doc/lockout.rdoc +83 -0
- data/doc/login.rdoc +27 -0
- data/doc/login_password_requirements_base.rdoc +50 -0
- data/doc/logout.rdoc +21 -0
- data/doc/otp.rdoc +100 -0
- data/doc/password_complexity.rdoc +50 -0
- data/doc/password_expiration.rdoc +52 -0
- data/doc/password_grace_period.rdoc +10 -0
- data/doc/recovery_codes.rdoc +60 -0
- data/doc/release_notes/1.0.0.txt +443 -0
- data/doc/remember.rdoc +82 -0
- data/doc/reset_password.rdoc +70 -0
- data/doc/session_expiration.rdoc +27 -0
- data/doc/single_session.rdoc +43 -0
- data/doc/sms_codes.rdoc +119 -0
- data/doc/two_factor_base.rdoc +27 -0
- data/doc/verify_account.rdoc +70 -0
- data/doc/verify_account_grace_period.rdoc +15 -0
- data/doc/verify_change_login.rdoc +9 -0
- data/lib/roda/plugins/rodauth.rb +3 -262
- data/lib/rodauth.rb +260 -0
- data/lib/rodauth/features/account_expiration.rb +108 -0
- data/lib/rodauth/features/base.rb +479 -0
- data/lib/rodauth/features/change_login.rb +77 -0
- data/lib/rodauth/features/change_password.rb +66 -0
- data/lib/rodauth/features/close_account.rb +82 -0
- data/lib/rodauth/features/confirm_password.rb +51 -0
- data/lib/rodauth/features/create_account.rb +128 -0
- data/lib/rodauth/features/disallow_password_reuse.rb +82 -0
- data/lib/rodauth/features/email_base.rb +63 -0
- data/lib/rodauth/features/jwt.rb +151 -0
- data/lib/rodauth/features/lockout.rb +262 -0
- data/lib/rodauth/features/login.rb +61 -0
- data/lib/rodauth/features/login_password_requirements_base.rb +123 -0
- data/lib/rodauth/features/logout.rb +37 -0
- data/lib/rodauth/features/otp.rb +338 -0
- data/lib/rodauth/features/password_complexity.rb +89 -0
- data/lib/rodauth/features/password_expiration.rb +111 -0
- data/lib/rodauth/features/password_grace_period.rb +46 -0
- data/lib/rodauth/features/recovery_codes.rb +240 -0
- data/lib/rodauth/features/remember.rb +200 -0
- data/lib/rodauth/features/reset_password.rb +207 -0
- data/lib/rodauth/features/session_expiration.rb +55 -0
- data/lib/rodauth/features/single_session.rb +87 -0
- data/lib/rodauth/features/sms_codes.rb +498 -0
- data/lib/rodauth/features/two_factor_base.rb +135 -0
- data/lib/rodauth/features/verify_account.rb +232 -0
- data/lib/rodauth/features/verify_account_grace_period.rb +76 -0
- data/lib/rodauth/features/verify_change_login.rb +20 -0
- data/lib/rodauth/migrations.rb +130 -0
- data/lib/rodauth/version.rb +9 -0
- data/spec/account_expiration_spec.rb +90 -0
- data/spec/all.rb +1 -0
- data/spec/change_login_spec.rb +149 -0
- data/spec/change_password_spec.rb +177 -0
- data/spec/close_account_spec.rb +162 -0
- data/spec/confirm_password_spec.rb +70 -0
- data/spec/create_account_spec.rb +127 -0
- data/spec/disallow_password_reuse_spec.rb +84 -0
- data/spec/lockout_spec.rb +228 -0
- data/spec/login_spec.rb +188 -0
- data/spec/migrate/001_tables.rb +103 -16
- data/spec/migrate/002_account_password_hash_column.rb +11 -0
- data/spec/migrate_password/001_tables.rb +60 -42
- data/spec/migrate_travis/001_tables.rb +116 -0
- data/spec/password_complexity_spec.rb +108 -0
- data/spec/password_expiration_spec.rb +243 -0
- data/spec/password_grace_period_spec.rb +93 -0
- data/spec/remember_spec.rb +424 -0
- data/spec/reset_password_spec.rb +185 -0
- data/spec/rodauth_spec.rb +57 -980
- data/spec/session_expiration_spec.rb +58 -0
- data/spec/single_session_spec.rb +107 -0
- data/spec/spec_helper.rb +202 -0
- data/spec/two_factor_spec.rb +1310 -0
- data/spec/verify_account_grace_period_spec.rb +135 -0
- data/spec/verify_account_spec.rb +142 -0
- data/spec/verify_change_login_spec.rb +46 -0
- data/spec/views/login.str +2 -2
- data/templates/add-recovery-codes.str +2 -0
- data/templates/button.str +5 -0
- data/templates/change-login.str +5 -18
- data/templates/change-password.str +6 -14
- data/templates/close-account.str +3 -6
- data/templates/confirm-password.str +4 -14
- data/templates/create-account.str +6 -30
- data/templates/login-confirm-field.str +6 -0
- data/templates/login-field.str +6 -0
- data/templates/login.str +5 -19
- data/templates/logout.str +2 -6
- data/templates/otp-auth-code-field.str +6 -0
- data/templates/otp-auth.str +8 -0
- data/templates/otp-disable.str +6 -0
- data/templates/otp-setup.str +21 -0
- data/templates/password-confirm-field.str +6 -0
- data/templates/password-field.str +6 -0
- data/templates/recovery-auth.str +12 -0
- data/templates/recovery-codes.str +6 -0
- data/templates/remember.str +8 -12
- data/templates/reset-password-request.str +2 -2
- data/templates/reset-password.str +4 -18
- data/templates/sms-auth.str +6 -0
- data/templates/sms-code-field.str +6 -0
- data/templates/sms-confirm.str +7 -0
- data/templates/sms-disable.str +7 -0
- data/templates/sms-request.str +5 -0
- data/templates/sms-setup.str +12 -0
- data/templates/unlock-account-request.str +3 -7
- data/templates/unlock-account.str +4 -7
- data/templates/verify-account-resend.str +2 -2
- data/templates/verify-account.str +2 -6
- metadata +191 -29
- data/lib/roda/plugins/rodauth/base.rb +0 -428
- data/lib/roda/plugins/rodauth/change_login.rb +0 -48
- data/lib/roda/plugins/rodauth/change_password.rb +0 -42
- data/lib/roda/plugins/rodauth/close_account.rb +0 -42
- data/lib/roda/plugins/rodauth/create_account.rb +0 -92
- data/lib/roda/plugins/rodauth/lockout.rb +0 -292
- data/lib/roda/plugins/rodauth/login.rb +0 -81
- data/lib/roda/plugins/rodauth/logout.rb +0 -36
- data/lib/roda/plugins/rodauth/remember.rb +0 -226
- data/lib/roda/plugins/rodauth/reset_password.rb +0 -205
- data/lib/roda/plugins/rodauth/verify_account.rb +0 -228
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
require File.expand_path("spec_helper", File.dirname(__FILE__))
|
|
2
|
+
|
|
3
|
+
describe 'Rodauth reset_password feature' do
|
|
4
|
+
it "should support resetting passwords for accounts" do
|
|
5
|
+
rodauth do
|
|
6
|
+
enable :login, :reset_password
|
|
7
|
+
end
|
|
8
|
+
roda do |r|
|
|
9
|
+
r.rodauth
|
|
10
|
+
r.root{view :content=>""}
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
login(:login=>'foo@example2.com', :pass=>'01234567')
|
|
14
|
+
page.html.wont_match(/notice_flash/)
|
|
15
|
+
|
|
16
|
+
login(:pass=>'01234567', :visit=>false)
|
|
17
|
+
|
|
18
|
+
click_button 'Request Password Reset'
|
|
19
|
+
page.find('#notice_flash').text.must_equal "An email has been sent to you with a link to reset the password for your account"
|
|
20
|
+
page.current_path.must_equal '/'
|
|
21
|
+
|
|
22
|
+
link = email_link(/(\/reset-password\?key=.+)$/)
|
|
23
|
+
visit link[0...-1]
|
|
24
|
+
page.find('#error_flash').text.must_equal "invalid password reset key"
|
|
25
|
+
|
|
26
|
+
visit link
|
|
27
|
+
page.title.must_equal 'Reset Password'
|
|
28
|
+
|
|
29
|
+
fill_in 'Password', :with=>'0123456'
|
|
30
|
+
fill_in 'Confirm Password', :with=>'0123456789'
|
|
31
|
+
click_button 'Reset Password'
|
|
32
|
+
page.html.must_include("passwords do not match")
|
|
33
|
+
page.find('#error_flash').text.must_equal "There was an error resetting your password"
|
|
34
|
+
page.current_path.must_equal '/reset-password'
|
|
35
|
+
|
|
36
|
+
fill_in 'Password', :with=>'0123456789'
|
|
37
|
+
fill_in 'Confirm Password', :with=>'0123456789'
|
|
38
|
+
click_button 'Reset Password'
|
|
39
|
+
page.body.must_include 'invalid password, same as current password'
|
|
40
|
+
page.find('#error_flash').text.must_equal "There was an error resetting your password"
|
|
41
|
+
page.current_path.must_equal '/reset-password'
|
|
42
|
+
|
|
43
|
+
fill_in 'Password', :with=>'012'
|
|
44
|
+
fill_in 'Confirm Password', :with=>'012'
|
|
45
|
+
click_button 'Reset Password'
|
|
46
|
+
page.html.must_include("invalid password, does not meet requirements")
|
|
47
|
+
page.find('#error_flash').text.must_equal "There was an error resetting your password"
|
|
48
|
+
page.current_path.must_equal '/reset-password'
|
|
49
|
+
|
|
50
|
+
fill_in 'Password', :with=>'0123456'
|
|
51
|
+
fill_in 'Confirm Password', :with=>'0123456'
|
|
52
|
+
click_button 'Reset Password'
|
|
53
|
+
page.find('#notice_flash').text.must_equal "Your password has been reset"
|
|
54
|
+
page.current_path.must_equal '/'
|
|
55
|
+
|
|
56
|
+
login(:pass=>'0123456')
|
|
57
|
+
page.current_path.must_equal '/'
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "should support resetting passwords for accounts without confirmation" do
|
|
61
|
+
rodauth do
|
|
62
|
+
enable :login, :reset_password
|
|
63
|
+
require_password_confirmation? false
|
|
64
|
+
end
|
|
65
|
+
roda do |r|
|
|
66
|
+
r.rodauth
|
|
67
|
+
r.root{view :content=>""}
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
visit '/login'
|
|
71
|
+
login(:pass=>'01234567', :visit=>false)
|
|
72
|
+
click_button 'Request Password Reset'
|
|
73
|
+
page.find('#notice_flash').text.must_equal "An email has been sent to you with a link to reset the password for your account"
|
|
74
|
+
|
|
75
|
+
link = email_link(/(\/reset-password\?key=.+)$/)
|
|
76
|
+
visit link
|
|
77
|
+
fill_in 'Password', :with=>'0123456'
|
|
78
|
+
click_button 'Reset Password'
|
|
79
|
+
page.find('#notice_flash').text.must_equal "Your password has been reset"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "should support autologin when resetting passwords for accounts" do
|
|
83
|
+
rodauth do
|
|
84
|
+
enable :login, :reset_password
|
|
85
|
+
reset_password_autologin? true
|
|
86
|
+
end
|
|
87
|
+
roda do |r|
|
|
88
|
+
r.rodauth
|
|
89
|
+
r.root{view :content=>rodauth.logged_in? ? "Logged In" : "Not Logged"}
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
login(:pass=>'01234567')
|
|
93
|
+
|
|
94
|
+
click_button 'Request Password Reset'
|
|
95
|
+
link = email_link(/(\/reset-password\?key=.+)$/)
|
|
96
|
+
visit link
|
|
97
|
+
fill_in 'Password', :with=>'0123456'
|
|
98
|
+
fill_in 'Confirm Password', :with=>'0123456'
|
|
99
|
+
click_button 'Reset Password'
|
|
100
|
+
page.find('#notice_flash').text.must_equal "Your password has been reset"
|
|
101
|
+
page.body.must_include("Logged In")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "should clear reset password token when closing account" do
|
|
105
|
+
rodauth do
|
|
106
|
+
enable :login, :reset_password, :close_account
|
|
107
|
+
reset_password_autologin? true
|
|
108
|
+
end
|
|
109
|
+
roda do |r|
|
|
110
|
+
r.rodauth
|
|
111
|
+
r.root{view :content=>rodauth.logged_in? ? "Logged In" : "Not Logged"}
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
login(:pass=>'01234567')
|
|
115
|
+
click_button 'Request Password Reset'
|
|
116
|
+
link = email_link(/(\/reset-password\?key=.+)$/)
|
|
117
|
+
|
|
118
|
+
login
|
|
119
|
+
|
|
120
|
+
DB[:account_password_reset_keys].count.must_equal 1
|
|
121
|
+
visit '/close-account'
|
|
122
|
+
fill_in 'Password', :with=>'0123456789'
|
|
123
|
+
click_button 'Close Account'
|
|
124
|
+
DB[:account_password_reset_keys].count.must_equal 0
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "should handle uniqueness errors raised when inserting password reset token" do
|
|
128
|
+
rodauth do
|
|
129
|
+
enable :login, :reset_password
|
|
130
|
+
end
|
|
131
|
+
roda do |r|
|
|
132
|
+
def rodauth.raised_uniqueness_violation(*) super; true; end
|
|
133
|
+
r.rodauth
|
|
134
|
+
r.root{view :content=>""}
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
login(:pass=>'01234567')
|
|
138
|
+
|
|
139
|
+
click_button 'Request Password Reset'
|
|
140
|
+
link = email_link(/(\/reset-password\?key=.+)$/)
|
|
141
|
+
visit link
|
|
142
|
+
|
|
143
|
+
fill_in 'Password', :with=>'0123456'
|
|
144
|
+
fill_in 'Confirm Password', :with=>'0123456'
|
|
145
|
+
click_button 'Reset Password'
|
|
146
|
+
page.find('#notice_flash').text.must_equal "Your password has been reset"
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it "should support resetting passwords for accounts via jwt" do
|
|
150
|
+
rodauth do
|
|
151
|
+
enable :login, :reset_password
|
|
152
|
+
reset_password_email_body{reset_password_email_link}
|
|
153
|
+
end
|
|
154
|
+
roda(:jwt) do |r|
|
|
155
|
+
r.rodauth
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
res = json_request('/reset-password')
|
|
159
|
+
res.must_equal [400, {"error"=>"There was an error resetting your password"}]
|
|
160
|
+
|
|
161
|
+
res = json_request('/reset-password-request', :login=>'foo@example2.com')
|
|
162
|
+
res.must_equal [400, {"error"=>"There was an error requesting a password reset"}]
|
|
163
|
+
|
|
164
|
+
res = json_request('/reset-password-request', :login=>'foo@example.com')
|
|
165
|
+
res.must_equal [200, {"success"=>"An email has been sent to you with a link to reset the password for your account"}]
|
|
166
|
+
|
|
167
|
+
link = email_link(/key=.+$/)
|
|
168
|
+
res = json_request('/reset-password', :key=>link[4...-1])
|
|
169
|
+
res.must_equal [400, {"error"=>"There was an error resetting your password"}]
|
|
170
|
+
|
|
171
|
+
res = json_request('/reset-password', :key=>link[4..-1], :password=>'1', "password-confirm"=>'2')
|
|
172
|
+
res.must_equal [400, {"error"=>"There was an error resetting your password", "field-error"=>["password", 'passwords do not match']}]
|
|
173
|
+
|
|
174
|
+
res = json_request('/reset-password', :key=>link[4..-1], :password=>'0123456789', "password-confirm"=>'0123456789')
|
|
175
|
+
res.must_equal [400, {"error"=>"There was an error resetting your password", "field-error"=>["password", 'invalid password, same as current password']}]
|
|
176
|
+
|
|
177
|
+
res = json_request('/reset-password', :key=>link[4..-1], :password=>'1', "password-confirm"=>'1')
|
|
178
|
+
res.must_equal [400, {"error"=>"There was an error resetting your password", "field-error"=>["password", "invalid password, does not meet requirements (minimum 6 characters)"]}]
|
|
179
|
+
|
|
180
|
+
res = json_request('/reset-password', :key=>link[4..-1], :password=>'0123456', "password-confirm"=>'0123456')
|
|
181
|
+
res.must_equal [200, {"success"=>"Your password has been reset"}]
|
|
182
|
+
|
|
183
|
+
json_login(:pass=>'0123456')
|
|
184
|
+
end
|
|
185
|
+
end
|
data/spec/rodauth_spec.rb
CHANGED
|
@@ -1,573 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
if ENV['COVERAGE']
|
|
4
|
-
require 'coverage'
|
|
5
|
-
require 'simplecov'
|
|
6
|
-
|
|
7
|
-
def SimpleCov.rodauth_coverage(opts = {})
|
|
8
|
-
start do
|
|
9
|
-
add_filter "/spec/"
|
|
10
|
-
add_group('Missing'){|src| src.covered_percent < 100}
|
|
11
|
-
add_group('Covered'){|src| src.covered_percent == 100}
|
|
12
|
-
yield self if block_given?
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
ENV.delete('COVERAGE')
|
|
17
|
-
SimpleCov.rodauth_coverage
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
require 'rubygems'
|
|
21
|
-
require 'capybara'
|
|
22
|
-
require 'capybara/dsl'
|
|
23
|
-
require 'rack/test'
|
|
24
|
-
gem 'minitest'
|
|
25
|
-
require 'minitest/autorun'
|
|
26
|
-
require 'minitest/hooks/default'
|
|
27
|
-
|
|
28
|
-
require 'roda'
|
|
29
|
-
require 'sequel'
|
|
30
|
-
require 'bcrypt'
|
|
31
|
-
require 'mail'
|
|
32
|
-
require 'logger'
|
|
33
|
-
require 'tilt/string'
|
|
34
|
-
|
|
35
|
-
DB = Sequel.postgres(:user=>'rodauth_test', :password=>'rodauth_test')
|
|
36
|
-
#DB.loggers << Logger.new($stdout)
|
|
37
|
-
|
|
38
|
-
ENV['RACK_ENV'] = 'test'
|
|
39
|
-
|
|
40
|
-
::Mail.defaults do
|
|
41
|
-
delivery_method :test
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
class Account < Sequel::Model
|
|
45
|
-
plugin :validation_helpers
|
|
46
|
-
|
|
47
|
-
def validate
|
|
48
|
-
super
|
|
49
|
-
validates_unique(:email){|ds| ds.where(:status_id=>[1,2])} unless status_id == 3
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
Base = Class.new(Roda)
|
|
54
|
-
Base.plugin :render, :layout=>{:path=>'spec/views/layout.str'}
|
|
55
|
-
Base.plugin(:not_found){raise "path #{request.path_info} not found"}
|
|
56
|
-
Base.use Rack::Session::Cookie, :secret=>'0123456789'
|
|
57
|
-
class Base
|
|
58
|
-
attr_writer :title
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
class Minitest::HooksSpec
|
|
62
|
-
include Rack::Test::Methods
|
|
63
|
-
include Capybara::DSL
|
|
64
|
-
|
|
65
|
-
attr_reader :app
|
|
66
|
-
|
|
67
|
-
def no_freeze!
|
|
68
|
-
@no_freeze = true
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def app=(app)
|
|
72
|
-
@app = Capybara.app = app
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def rodauth(&block)
|
|
76
|
-
@rodauth_block = block
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def roda(&block)
|
|
80
|
-
app = Class.new(Base)
|
|
81
|
-
rodauth_block = @rodauth_block
|
|
82
|
-
app.plugin(:rodauth) do
|
|
83
|
-
title_instance_variable :@title
|
|
84
|
-
instance_exec(&rodauth_block)
|
|
85
|
-
end
|
|
86
|
-
app.route(&block)
|
|
87
|
-
app.freeze unless @no_freeze
|
|
88
|
-
self.app = app
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def email_link(regexp)
|
|
92
|
-
link = Mail::TestMailer.deliveries.first.body.to_s[regexp]
|
|
93
|
-
Mail::TestMailer.deliveries.clear
|
|
94
|
-
link.must_be_kind_of(String)
|
|
95
|
-
link
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def remove_cookie(key)
|
|
99
|
-
page.driver.browser.rack_mock_session.cookie_jar.delete(key)
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def get_cookie(key)
|
|
103
|
-
page.driver.browser.rack_mock_session.cookie_jar[key]
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def set_cookie(key, value)
|
|
107
|
-
page.driver.browser.rack_mock_session.cookie_jar[key] = value
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
around do |&block|
|
|
111
|
-
DB.transaction(:rollback=>:always, :savepoint=>true, :auto_savepoint=>true){super(&block)}
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
around(:all) do |&block|
|
|
115
|
-
DB.transaction(:rollback=>:always){super(&block)}
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
after do
|
|
119
|
-
Capybara.reset_sessions!
|
|
120
|
-
Capybara.use_default_driver
|
|
121
|
-
end
|
|
122
|
-
end
|
|
1
|
+
require File.expand_path("spec_helper", File.dirname(__FILE__))
|
|
123
2
|
|
|
124
3
|
describe 'Rodauth' do
|
|
125
|
-
|
|
126
|
-
hash = BCrypt::Password.create('0123456789', :cost=>BCrypt::Engine::MIN_COST)
|
|
127
|
-
DB[:account_password_hashes].insert(:id=>Account.create(:email=>'foo@example.com', :status_id=>2, :ph=>hash).id, :password_hash=>hash)
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
it "should handle logins and logouts" do
|
|
131
|
-
rodauth{enable :login, :logout}
|
|
132
|
-
roda do |r|
|
|
133
|
-
r.rodauth
|
|
134
|
-
next unless session[:account_id]
|
|
135
|
-
r.root{view :content=>"Logged In"}
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
visit '/login'
|
|
139
|
-
page.title.must_equal 'Login'
|
|
140
|
-
|
|
141
|
-
fill_in 'Login', :with=>'foo@example2.com'
|
|
142
|
-
fill_in 'Password', :with=>'0123456789'
|
|
143
|
-
click_button 'Login'
|
|
144
|
-
page.find('#error_flash').text.must_equal 'There was an error logging in'
|
|
145
|
-
page.html.must_match(/no matching login/)
|
|
146
|
-
|
|
147
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
148
|
-
fill_in 'Password', :with=>'012345678'
|
|
149
|
-
click_button 'Login'
|
|
150
|
-
page.find('#error_flash').text.must_equal 'There was an error logging in'
|
|
151
|
-
page.html.must_match(/invalid password/)
|
|
152
|
-
|
|
153
|
-
fill_in 'Password', :with=>'0123456789'
|
|
154
|
-
click_button 'Login'
|
|
155
|
-
page.current_path.must_equal '/'
|
|
156
|
-
page.find('#notice_flash').text.must_equal 'You have been logged in'
|
|
157
|
-
page.html.must_match(/Logged In/)
|
|
158
|
-
|
|
159
|
-
visit '/logout'
|
|
160
|
-
page.title.must_equal 'Logout'
|
|
161
|
-
|
|
162
|
-
click_button 'Logout'
|
|
163
|
-
page.find('#notice_flash').text.must_equal 'You have been logged out'
|
|
164
|
-
page.current_path.must_equal '/login'
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
it "should not allow login to unverified account" do
|
|
168
|
-
rodauth{enable :login}
|
|
169
|
-
roda do |r|
|
|
170
|
-
r.rodauth
|
|
171
|
-
next unless session[:account_id]
|
|
172
|
-
r.root{view :content=>"Logged In"}
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
visit '/login'
|
|
176
|
-
page.title.must_equal 'Login'
|
|
177
|
-
|
|
178
|
-
Account.first.update(:status_id=>1)
|
|
179
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
180
|
-
fill_in 'Password', :with=>'0123456789'
|
|
181
|
-
click_button 'Login'
|
|
182
|
-
page.find('#error_flash').text.must_equal 'There was an error logging in'
|
|
183
|
-
page.html.must_match(/unverified account, please verify account before logging in/)
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
it "should handle overriding login action" do
|
|
187
|
-
rodauth do
|
|
188
|
-
enable :login
|
|
189
|
-
login_post_block do |r, _|
|
|
190
|
-
if r['login'] == 'apple' && r['password'] == 'banana'
|
|
191
|
-
session[:user_id] = 'pear'
|
|
192
|
-
r.redirect '/'
|
|
193
|
-
end
|
|
194
|
-
r.redirect '/login'
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
roda do |r|
|
|
198
|
-
r.rodauth
|
|
199
|
-
next unless session[:user_id] == 'pear'
|
|
200
|
-
r.root{"Logged In"}
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
visit '/login'
|
|
204
|
-
|
|
205
|
-
fill_in 'Login', :with=>'appl'
|
|
206
|
-
fill_in 'Password', :with=>'banana'
|
|
207
|
-
click_button 'Login'
|
|
208
|
-
page.html.wont_match(/Logged In/)
|
|
209
|
-
|
|
210
|
-
fill_in 'Login', :with=>'apple'
|
|
211
|
-
fill_in 'Password', :with=>'banan'
|
|
212
|
-
click_button 'Login'
|
|
213
|
-
page.html.wont_match(/Logged In/)
|
|
214
|
-
|
|
215
|
-
fill_in 'Login', :with=>'apple'
|
|
216
|
-
fill_in 'Password', :with=>'banana'
|
|
217
|
-
click_button 'Login'
|
|
218
|
-
page.current_path.must_equal '/'
|
|
219
|
-
page.html.must_match(/Logged In/)
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
it "should handle overriding some login attributes" do
|
|
223
|
-
rodauth do
|
|
224
|
-
enable :login
|
|
225
|
-
account_from_login do |login|
|
|
226
|
-
Account.first if login == 'apple'
|
|
227
|
-
end
|
|
228
|
-
password_match? do |password|
|
|
229
|
-
password == 'banana'
|
|
230
|
-
end
|
|
231
|
-
update_session do
|
|
232
|
-
session[:user_id] = 'pear'
|
|
233
|
-
end
|
|
234
|
-
no_matching_login_message "no user"
|
|
235
|
-
invalid_password_message "bad password"
|
|
236
|
-
end
|
|
237
|
-
roda do |r|
|
|
238
|
-
r.rodauth
|
|
239
|
-
next unless session[:user_id] == 'pear'
|
|
240
|
-
r.root{"Logged In"}
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
visit '/login'
|
|
244
|
-
|
|
245
|
-
fill_in 'Login', :with=>'appl'
|
|
246
|
-
fill_in 'Password', :with=>'banana'
|
|
247
|
-
click_button 'Login'
|
|
248
|
-
page.html.must_match(/no user/)
|
|
249
|
-
|
|
250
|
-
fill_in 'Login', :with=>'apple'
|
|
251
|
-
fill_in 'Password', :with=>'banan'
|
|
252
|
-
click_button 'Login'
|
|
253
|
-
page.html.must_match(/bad password/)
|
|
254
|
-
|
|
255
|
-
fill_in 'Password', :with=>'banana'
|
|
256
|
-
click_button 'Login'
|
|
257
|
-
page.current_path.must_equal '/'
|
|
258
|
-
page.html.must_match(/Logged In/)
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
it "should handle a prefix and some other login options" do
|
|
262
|
-
rodauth do
|
|
263
|
-
enable :login, :logout
|
|
264
|
-
prefix 'auth'
|
|
265
|
-
session_key :login_email
|
|
266
|
-
account_from_session{Account.first(:email=>session_value)}
|
|
267
|
-
account_session_value{account.email}
|
|
268
|
-
login_param{request['lp']}
|
|
269
|
-
password_param 'p'
|
|
270
|
-
login_redirect{"/foo/#{account.email}"}
|
|
271
|
-
logout_redirect '/auth/lin'
|
|
272
|
-
login_route 'lin'
|
|
273
|
-
logout_route 'lout'
|
|
274
|
-
end
|
|
275
|
-
no_freeze!
|
|
276
|
-
roda do |r|
|
|
277
|
-
r.on 'auth' do
|
|
278
|
-
r.rodauth
|
|
279
|
-
end
|
|
280
|
-
next unless session[:login_email] =~ /example/
|
|
281
|
-
r.get('foo/:email'){|e| "Logged In: #{e}"}
|
|
282
|
-
end
|
|
283
|
-
app.plugin :render, :views=>'spec/views', :engine=>'str'
|
|
284
|
-
|
|
285
|
-
visit '/auth/lin?lp=l'
|
|
286
|
-
|
|
287
|
-
fill_in 'Login', :with=>'foo@example2.com'
|
|
288
|
-
fill_in 'Password', :with=>'0123456789'
|
|
289
|
-
click_button 'Login'
|
|
290
|
-
page.html.must_match(/no matching login/)
|
|
291
|
-
|
|
292
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
293
|
-
fill_in 'Password', :with=>'012345678'
|
|
294
|
-
click_button 'Login'
|
|
295
|
-
page.html.must_match(/invalid password/)
|
|
296
|
-
|
|
297
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
298
|
-
fill_in 'Password', :with=>'0123456789'
|
|
299
|
-
click_button 'Login'
|
|
300
|
-
page.current_path.must_equal '/foo/foo@example.com'
|
|
301
|
-
page.html.must_match(/Logged In: foo@example\.com/)
|
|
302
|
-
|
|
303
|
-
visit '/auth/lout'
|
|
304
|
-
click_button 'Logout'
|
|
305
|
-
page.current_path.must_equal '/auth/lin'
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
it "should support closing accounts" do
|
|
309
|
-
rodauth do
|
|
310
|
-
enable :login, :close_account
|
|
311
|
-
end
|
|
312
|
-
roda do |r|
|
|
313
|
-
r.rodauth
|
|
314
|
-
r.root{""}
|
|
315
|
-
end
|
|
316
|
-
|
|
317
|
-
visit '/login'
|
|
318
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
319
|
-
fill_in 'Password', :with=>'0123456789'
|
|
320
|
-
click_button 'Login'
|
|
321
|
-
page.current_path.must_equal '/'
|
|
322
|
-
|
|
323
|
-
visit '/close-account'
|
|
324
|
-
click_button 'Close Account'
|
|
325
|
-
page.current_path.must_equal '/'
|
|
326
|
-
|
|
327
|
-
Account.select_map(:status_id).must_equal [3]
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
it "should support closing accounts with overrides" do
|
|
331
|
-
rodauth do
|
|
332
|
-
enable :login, :close_account
|
|
333
|
-
close_account do
|
|
334
|
-
account.email = 'foo@bar.com'
|
|
335
|
-
super()
|
|
336
|
-
end
|
|
337
|
-
close_account_route 'close'
|
|
338
|
-
close_account_redirect '/login'
|
|
339
|
-
end
|
|
340
|
-
roda do |r|
|
|
341
|
-
r.rodauth
|
|
342
|
-
r.root{""}
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
visit '/login'
|
|
346
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
347
|
-
fill_in 'Password', :with=>'0123456789'
|
|
348
|
-
click_button 'Login'
|
|
349
|
-
page.current_path.must_equal '/'
|
|
350
|
-
|
|
351
|
-
visit '/close'
|
|
352
|
-
page.title.must_equal 'Close Account'
|
|
353
|
-
click_button 'Close Account'
|
|
354
|
-
page.find('#notice_flash').text.must_equal "Your account has been closed"
|
|
355
|
-
page.current_path.must_equal '/login'
|
|
356
|
-
|
|
357
|
-
Account.select_map(:status_id).must_equal [3]
|
|
358
|
-
Account.select_map(:email).must_equal ['foo@bar.com']
|
|
359
|
-
end
|
|
360
|
-
|
|
361
|
-
[false, true].each do |ph|
|
|
362
|
-
it "should support creating accounts #{'with account_password_hash_column' if ph}" do
|
|
363
|
-
rodauth do
|
|
364
|
-
enable :login, :create_account
|
|
365
|
-
account_password_hash_column :ph if ph
|
|
366
|
-
end
|
|
367
|
-
roda do |r|
|
|
368
|
-
r.rodauth
|
|
369
|
-
r.root{view :content=>""}
|
|
370
|
-
end
|
|
371
|
-
|
|
372
|
-
visit '/create-account'
|
|
373
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
374
|
-
fill_in 'Confirm Login', :with=>'foo@example.com'
|
|
375
|
-
fill_in 'Password', :with=>'0123456789'
|
|
376
|
-
fill_in 'Confirm Password', :with=>'0123456789'
|
|
377
|
-
click_button 'Create Account'
|
|
378
|
-
page.html.must_match(/is already taken/)
|
|
379
|
-
page.find('#error_flash').text.must_equal "There was an error creating your account"
|
|
380
|
-
page.current_path.must_equal '/create-account'
|
|
381
|
-
|
|
382
|
-
fill_in 'Login', :with=>'foo@example2.com'
|
|
383
|
-
fill_in 'Password', :with=>'0123456789'
|
|
384
|
-
fill_in 'Confirm Password', :with=>'0123456789'
|
|
385
|
-
click_button 'Create Account'
|
|
386
|
-
page.html.must_match(/logins do not match/)
|
|
387
|
-
page.find('#error_flash').text.must_equal "There was an error creating your account"
|
|
388
|
-
page.current_path.must_equal '/create-account'
|
|
389
|
-
|
|
390
|
-
fill_in 'Confirm Login', :with=>'foo@example2.com'
|
|
391
|
-
fill_in 'Password', :with=>'0123456789'
|
|
392
|
-
fill_in 'Confirm Password', :with=>'012345678'
|
|
393
|
-
click_button 'Create Account'
|
|
394
|
-
page.html.must_match(/passwords do not match/)
|
|
395
|
-
page.find('#error_flash').text.must_equal "There was an error creating your account"
|
|
396
|
-
page.current_path.must_equal '/create-account'
|
|
397
|
-
|
|
398
|
-
fill_in 'Password', :with=>'0123456789'
|
|
399
|
-
fill_in 'Confirm Password', :with=>'0123456789'
|
|
400
|
-
click_button 'Create Account'
|
|
401
|
-
page.find('#notice_flash').text.must_equal "Your account has been created"
|
|
402
|
-
page.current_path.must_equal '/'
|
|
403
|
-
|
|
404
|
-
visit '/login'
|
|
405
|
-
fill_in 'Login', :with=>'foo@example2.com'
|
|
406
|
-
fill_in 'Password', :with=>'0123456789'
|
|
407
|
-
click_button 'Login'
|
|
408
|
-
page.current_path.must_equal '/'
|
|
409
|
-
end
|
|
410
|
-
|
|
411
|
-
it "should support changing passwords for accounts #{'with account_password_hash_column' if ph}" do
|
|
412
|
-
rodauth do
|
|
413
|
-
enable :login, :logout, :change_password
|
|
414
|
-
account_password_hash_column :ph if ph
|
|
415
|
-
end
|
|
416
|
-
roda do |r|
|
|
417
|
-
r.rodauth
|
|
418
|
-
r.root{view :content=>""}
|
|
419
|
-
end
|
|
420
|
-
|
|
421
|
-
visit '/login'
|
|
422
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
423
|
-
fill_in 'Password', :with=>'0123456789'
|
|
424
|
-
click_button 'Login'
|
|
425
|
-
page.current_path.must_equal '/'
|
|
426
|
-
|
|
427
|
-
visit '/change-password'
|
|
428
|
-
page.title.must_equal 'Change Password'
|
|
429
|
-
|
|
430
|
-
fill_in 'Password', :with=>'0123456'
|
|
431
|
-
fill_in 'Confirm Password', :with=>'0123456789'
|
|
432
|
-
click_button 'Change Password'
|
|
433
|
-
page.html.must_match(/passwords do not match/)
|
|
434
|
-
page.find('#error_flash').text.must_equal "There was an error changing your password"
|
|
435
|
-
page.current_path.must_equal '/change-password'
|
|
436
|
-
|
|
437
|
-
fill_in 'Password', :with=>'0123456'
|
|
438
|
-
fill_in 'Confirm Password', :with=>'0123456'
|
|
439
|
-
click_button 'Change Password'
|
|
440
|
-
page.find('#notice_flash').text.must_equal "Your password has been changed"
|
|
441
|
-
page.current_path.must_equal '/'
|
|
442
|
-
|
|
443
|
-
visit '/logout'
|
|
444
|
-
click_button 'Logout'
|
|
445
|
-
|
|
446
|
-
visit '/login'
|
|
447
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
448
|
-
fill_in 'Password', :with=>'0123456789'
|
|
449
|
-
click_button 'Login'
|
|
450
|
-
page.html.must_match(/invalid password/)
|
|
451
|
-
page.current_path.must_equal '/login'
|
|
452
|
-
|
|
453
|
-
fill_in 'Password', :with=>'0123456'
|
|
454
|
-
click_button 'Login'
|
|
455
|
-
page.current_path.must_equal '/'
|
|
456
|
-
end
|
|
457
|
-
end
|
|
458
|
-
|
|
459
|
-
it "should support changing logins for accounts" do
|
|
460
|
-
Account.create(:email=>'foo2@example.com')
|
|
461
|
-
|
|
462
|
-
rodauth do
|
|
463
|
-
enable :login, :logout, :change_login
|
|
464
|
-
end
|
|
465
|
-
roda do |r|
|
|
466
|
-
r.rodauth
|
|
467
|
-
r.root{view :content=>""}
|
|
468
|
-
end
|
|
469
|
-
|
|
470
|
-
visit '/login'
|
|
471
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
472
|
-
fill_in 'Password', :with=>'0123456789'
|
|
473
|
-
click_button 'Login'
|
|
474
|
-
page.current_path.must_equal '/'
|
|
475
|
-
|
|
476
|
-
visit '/change-login'
|
|
477
|
-
page.title.must_equal 'Change Login'
|
|
478
|
-
|
|
479
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
480
|
-
fill_in 'Confirm Login', :with=>'foo2@example.com'
|
|
481
|
-
click_button 'Change Login'
|
|
482
|
-
page.find('#error_flash').text.must_equal "There was an error changing your login"
|
|
483
|
-
page.html.must_match(/logins do not match/)
|
|
484
|
-
page.current_path.must_equal '/change-login'
|
|
485
|
-
|
|
486
|
-
fill_in 'Login', :with=>'foo2@example.com'
|
|
487
|
-
click_button 'Change Login'
|
|
488
|
-
page.find('#error_flash').text.must_equal "There was an error changing your login"
|
|
489
|
-
page.html.must_match(/is already taken/)
|
|
490
|
-
page.current_path.must_equal '/change-login'
|
|
491
|
-
|
|
492
|
-
fill_in 'Login', :with=>'foo3@example.com'
|
|
493
|
-
fill_in 'Confirm Login', :with=>'foo3@example.com'
|
|
494
|
-
click_button 'Change Login'
|
|
495
|
-
page.find('#notice_flash').text.must_equal "Your login has been changed"
|
|
496
|
-
page.current_path.must_equal '/'
|
|
497
|
-
|
|
498
|
-
visit '/logout'
|
|
499
|
-
click_button 'Logout'
|
|
500
|
-
|
|
501
|
-
visit '/login'
|
|
502
|
-
fill_in 'Login', :with=>'foo3@example.com'
|
|
503
|
-
fill_in 'Password', :with=>'0123456789'
|
|
504
|
-
click_button 'Login'
|
|
505
|
-
page.current_path.must_equal '/'
|
|
506
|
-
end
|
|
507
|
-
|
|
508
|
-
it "should support setting requirements for passwords" do
|
|
509
|
-
rodauth do
|
|
510
|
-
enable :login, :create_account, :change_password
|
|
511
|
-
password_meets_requirements? do |password|
|
|
512
|
-
password =~ /banana/
|
|
513
|
-
end
|
|
514
|
-
end
|
|
515
|
-
roda do |r|
|
|
516
|
-
r.rodauth
|
|
517
|
-
r.root{view :content=>""}
|
|
518
|
-
end
|
|
519
|
-
|
|
520
|
-
visit '/create-account'
|
|
521
|
-
fill_in 'Login', :with=>'foo2@example.com'
|
|
522
|
-
fill_in 'Confirm Login', :with=>'foo2@example.com'
|
|
523
|
-
fill_in 'Password', :with=>'apple'
|
|
524
|
-
fill_in 'Confirm Password', :with=>'apple'
|
|
525
|
-
click_button 'Create Account'
|
|
526
|
-
page.html.must_match(/invalid password, does not meet requirements/)
|
|
527
|
-
page.find('#error_flash').text.must_equal "There was an error creating your account"
|
|
528
|
-
page.current_path.must_equal '/create-account'
|
|
529
|
-
|
|
530
|
-
fill_in 'Password', :with=>'banana'
|
|
531
|
-
fill_in 'Confirm Password', :with=>'banana'
|
|
532
|
-
click_button 'Create Account'
|
|
533
|
-
|
|
534
|
-
visit '/login'
|
|
535
|
-
fill_in 'Login', :with=>'foo2@example.com'
|
|
536
|
-
fill_in 'Password', :with=>'banana'
|
|
537
|
-
click_button 'Login'
|
|
538
|
-
|
|
539
|
-
visit '/change-password'
|
|
540
|
-
fill_in 'Password', :with=>'apple'
|
|
541
|
-
fill_in 'Confirm Password', :with=>'apple'
|
|
542
|
-
click_button 'Change Password'
|
|
543
|
-
page.html.must_match(/invalid password, does not meet requirements/)
|
|
544
|
-
page.find('#error_flash').text.must_equal "There was an error changing your password"
|
|
545
|
-
page.current_path.must_equal '/change-password'
|
|
546
|
-
|
|
547
|
-
fill_in 'Password', :with=>'my_banana_3'
|
|
548
|
-
fill_in 'Confirm Password', :with=>'my_banana_3'
|
|
549
|
-
click_button 'Change Password'
|
|
550
|
-
page.current_path.must_equal '/'
|
|
551
|
-
end
|
|
552
|
-
|
|
553
|
-
it "should support autologin after account creation" do
|
|
4
|
+
it "should keep private methods private when overridden" do
|
|
554
5
|
rodauth do
|
|
555
|
-
|
|
556
|
-
create_account_autologin? true
|
|
6
|
+
use_database_authentication_functions? false
|
|
557
7
|
end
|
|
558
8
|
roda do |r|
|
|
559
|
-
|
|
560
|
-
next unless session[:account_id]
|
|
561
|
-
r.root{view :content=>"Logged In: #{Account[session[:account_id]].email}"}
|
|
9
|
+
rodauth.use_database_authentication_functions?.to_s
|
|
562
10
|
end
|
|
563
11
|
|
|
564
|
-
visit '/
|
|
565
|
-
fill_in 'Login', :with=>'foo2@example.com'
|
|
566
|
-
fill_in 'Confirm Login', :with=>'foo2@example.com'
|
|
567
|
-
fill_in 'Password', :with=>'apple2'
|
|
568
|
-
fill_in 'Confirm Password', :with=>'apple2'
|
|
569
|
-
click_button 'Create Account'
|
|
570
|
-
page.html.must_match(/Logged In: foo2@example\.com/)
|
|
12
|
+
proc{visit '/'}.must_raise NoMethodError
|
|
571
13
|
end
|
|
572
14
|
|
|
573
15
|
it "should require login to perform certain actions" do
|
|
@@ -599,6 +41,7 @@ describe 'Rodauth' do
|
|
|
599
41
|
rodauth do
|
|
600
42
|
enable :login, :change_password
|
|
601
43
|
already_logged_in{request.redirect '/'}
|
|
44
|
+
skip_status_checks? false
|
|
602
45
|
end
|
|
603
46
|
roda do |r|
|
|
604
47
|
r.rodauth
|
|
@@ -608,17 +51,14 @@ describe 'Rodauth' do
|
|
|
608
51
|
end
|
|
609
52
|
end
|
|
610
53
|
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
fill_in 'Password', :with=>'0123456789'
|
|
614
|
-
click_button 'Login'
|
|
615
|
-
page.body.must_match(/Logged In/)
|
|
54
|
+
login
|
|
55
|
+
page.body.must_include("Logged In")
|
|
616
56
|
|
|
617
|
-
|
|
57
|
+
DB[:accounts].update(:status_id=>3)
|
|
618
58
|
visit '/change-password'
|
|
619
59
|
page.current_path.must_equal '/login'
|
|
620
60
|
visit '/'
|
|
621
|
-
page.body.
|
|
61
|
+
page.body.must_include("Not Logged")
|
|
622
62
|
end
|
|
623
63
|
|
|
624
64
|
it "should handle cases where you are already logged in on pages that don't expect a login" do
|
|
@@ -634,10 +74,7 @@ describe 'Rodauth' do
|
|
|
634
74
|
end
|
|
635
75
|
end
|
|
636
76
|
|
|
637
|
-
|
|
638
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
639
|
-
fill_in 'Password', :with=>'0123456789'
|
|
640
|
-
click_button 'Login'
|
|
77
|
+
login
|
|
641
78
|
|
|
642
79
|
visit '/login'
|
|
643
80
|
page.current_path.must_equal '/'
|
|
@@ -655,423 +92,34 @@ describe 'Rodauth' do
|
|
|
655
92
|
page.current_path.must_equal '/logout'
|
|
656
93
|
end
|
|
657
94
|
|
|
658
|
-
it "should
|
|
659
|
-
rodauth do
|
|
660
|
-
enable :login, :reset_password
|
|
661
|
-
end
|
|
662
|
-
roda do |r|
|
|
663
|
-
r.rodauth
|
|
664
|
-
r.root{view :content=>""}
|
|
665
|
-
end
|
|
666
|
-
|
|
667
|
-
visit '/login'
|
|
668
|
-
fill_in 'Login', :with=>'foo@example2.com'
|
|
669
|
-
fill_in 'Password', :with=>'01234567'
|
|
670
|
-
click_button 'Login'
|
|
671
|
-
page.html.wont_match(/notice_flash/)
|
|
672
|
-
|
|
673
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
674
|
-
fill_in 'Password', :with=>'01234567'
|
|
675
|
-
click_button 'Login'
|
|
676
|
-
|
|
677
|
-
click_button 'Request Password Reset'
|
|
678
|
-
page.find('#notice_flash').text.must_equal "An email has been sent to you with a link to reset the password for your account"
|
|
679
|
-
page.current_path.must_equal '/'
|
|
680
|
-
|
|
681
|
-
link = email_link(/(\/reset-password\?key=.+)$/)
|
|
682
|
-
visit link[0...-1]
|
|
683
|
-
page.find('#error_flash').text.must_equal "invalid password reset key"
|
|
684
|
-
|
|
685
|
-
visit link
|
|
686
|
-
page.title.must_equal 'Reset Password'
|
|
687
|
-
|
|
688
|
-
fill_in 'Password', :with=>'0123456'
|
|
689
|
-
fill_in 'Confirm Password', :with=>'0123456789'
|
|
690
|
-
click_button 'Reset Password'
|
|
691
|
-
page.html.must_match(/passwords do not match/)
|
|
692
|
-
page.find('#error_flash').text.must_equal "There was an error resetting your password"
|
|
693
|
-
page.current_path.must_equal '/reset-password'
|
|
694
|
-
|
|
695
|
-
fill_in 'Password', :with=>'012'
|
|
696
|
-
fill_in 'Confirm Password', :with=>'012'
|
|
697
|
-
click_button 'Reset Password'
|
|
698
|
-
page.html.must_match(/invalid password, does not meet requirements/)
|
|
699
|
-
page.find('#error_flash').text.must_equal "There was an error resetting your password"
|
|
700
|
-
page.current_path.must_equal '/reset-password'
|
|
701
|
-
|
|
702
|
-
fill_in 'Password', :with=>'0123456'
|
|
703
|
-
fill_in 'Confirm Password', :with=>'0123456'
|
|
704
|
-
click_button 'Reset Password'
|
|
705
|
-
page.find('#notice_flash').text.must_equal "Your password has been reset"
|
|
706
|
-
page.current_path.must_equal '/'
|
|
707
|
-
|
|
708
|
-
visit '/login'
|
|
709
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
710
|
-
fill_in 'Password', :with=>'0123456'
|
|
711
|
-
click_button 'Login'
|
|
712
|
-
page.current_path.must_equal '/'
|
|
713
|
-
end
|
|
714
|
-
|
|
715
|
-
it "should support autologin when resetting passwords for accounts" do
|
|
716
|
-
rodauth do
|
|
717
|
-
enable :login, :reset_password
|
|
718
|
-
reset_password_autologin? true
|
|
719
|
-
end
|
|
720
|
-
roda do |r|
|
|
721
|
-
r.rodauth
|
|
722
|
-
r.root{view :content=>rodauth.logged_in? ? "Logged In" : "Not Logged"}
|
|
723
|
-
end
|
|
724
|
-
|
|
725
|
-
visit '/login'
|
|
726
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
727
|
-
fill_in 'Password', :with=>'01234567'
|
|
728
|
-
click_button 'Login'
|
|
729
|
-
|
|
730
|
-
click_button 'Request Password Reset'
|
|
731
|
-
link = email_link(/(\/reset-password\?key=.+)$/)
|
|
732
|
-
visit link
|
|
733
|
-
fill_in 'Password', :with=>'0123456'
|
|
734
|
-
fill_in 'Confirm Password', :with=>'0123456'
|
|
735
|
-
click_button 'Reset Password'
|
|
736
|
-
page.find('#notice_flash').text.must_equal "Your password has been reset"
|
|
737
|
-
page.body.must_match(/Logged In/)
|
|
738
|
-
end
|
|
739
|
-
|
|
740
|
-
it "should support verifying accounts" do
|
|
741
|
-
rodauth do
|
|
742
|
-
enable :login, :create_account, :verify_account
|
|
743
|
-
end
|
|
744
|
-
roda do |r|
|
|
745
|
-
r.rodauth
|
|
746
|
-
r.root{view :content=>""}
|
|
747
|
-
end
|
|
748
|
-
|
|
749
|
-
visit '/create-account'
|
|
750
|
-
fill_in 'Login', :with=>'foo@example2.com'
|
|
751
|
-
fill_in 'Confirm Login', :with=>'foo@example2.com'
|
|
752
|
-
fill_in 'Password', :with=>'0123456789'
|
|
753
|
-
fill_in 'Confirm Password', :with=>'0123456789'
|
|
754
|
-
click_button 'Create Account'
|
|
755
|
-
page.find('#notice_flash').text.must_equal "An email has been sent to you with a link to verify your account"
|
|
756
|
-
page.current_path.must_equal '/'
|
|
757
|
-
|
|
758
|
-
link = email_link(/(\/verify-account\?key=.+)$/)
|
|
759
|
-
visit '/login'
|
|
760
|
-
fill_in 'Login', :with=>'foo@example2.com'
|
|
761
|
-
fill_in 'Password', :with=>'0123456789'
|
|
762
|
-
click_button 'Login'
|
|
763
|
-
page.find('#error_flash').text.must_equal 'The account you tried to login with is currently awaiting verification'
|
|
764
|
-
page.html.must_match(/If you no longer have the email to verify the account, you can request that it be resent to you/)
|
|
765
|
-
click_button 'Send Verification Email Again'
|
|
766
|
-
page.current_path.must_equal '/login'
|
|
767
|
-
|
|
768
|
-
email_link(/(\/verify-account\?key=.+)$/).must_equal link
|
|
769
|
-
visit '/create-account'
|
|
770
|
-
fill_in 'Login', :with=>'foo@example2.com'
|
|
771
|
-
click_button 'Create Account'
|
|
772
|
-
click_button 'Send Verification Email Again'
|
|
773
|
-
page.find('#notice_flash').text.must_equal "An email has been sent to you with a link to verify your account"
|
|
774
|
-
page.current_path.must_equal '/login'
|
|
775
|
-
|
|
776
|
-
link = email_link(/(\/verify-account\?key=.+)$/)
|
|
777
|
-
visit link[0...-1]
|
|
778
|
-
page.find('#error_flash').text.must_equal "invalid verify account key"
|
|
779
|
-
|
|
780
|
-
visit link
|
|
781
|
-
click_button 'Verify Account'
|
|
782
|
-
page.find('#notice_flash').text.must_equal "Your account has been verified"
|
|
783
|
-
page.current_path.must_equal '/'
|
|
784
|
-
|
|
785
|
-
visit '/login'
|
|
786
|
-
fill_in 'Login', :with=>'foo@example2.com'
|
|
787
|
-
fill_in 'Password', :with=>'0123456789'
|
|
788
|
-
click_button 'Login'
|
|
789
|
-
page.find('#notice_flash').text.must_equal 'You have been logged in'
|
|
790
|
-
page.current_path.must_equal '/'
|
|
791
|
-
end
|
|
792
|
-
|
|
793
|
-
it "should support autologin when verifying accounts" do
|
|
794
|
-
rodauth do
|
|
795
|
-
enable :login, :create_account, :verify_account
|
|
796
|
-
verify_account_autologin? true
|
|
797
|
-
end
|
|
798
|
-
roda do |r|
|
|
799
|
-
r.rodauth
|
|
800
|
-
r.root{view :content=>rodauth.logged_in? ? "Logged In" : "Not Logged"}
|
|
801
|
-
end
|
|
802
|
-
|
|
803
|
-
visit '/create-account'
|
|
804
|
-
fill_in 'Login', :with=>'foo@example2.com'
|
|
805
|
-
fill_in 'Confirm Login', :with=>'foo@example2.com'
|
|
806
|
-
fill_in 'Password', :with=>'0123456789'
|
|
807
|
-
fill_in 'Confirm Password', :with=>'0123456789'
|
|
808
|
-
click_button 'Create Account'
|
|
809
|
-
page.find('#notice_flash').text.must_equal "An email has been sent to you with a link to verify your account"
|
|
810
|
-
page.current_path.must_equal '/'
|
|
811
|
-
|
|
812
|
-
link = email_link(/(\/verify-account\?key=.+)$/)
|
|
813
|
-
visit link
|
|
814
|
-
click_button 'Verify Account'
|
|
815
|
-
page.find('#notice_flash').text.must_equal "Your account has been verified"
|
|
816
|
-
page.body.must_match /Logged In/
|
|
817
|
-
end
|
|
818
|
-
|
|
819
|
-
it "should support login via remember token" do
|
|
820
|
-
rodauth do
|
|
821
|
-
enable :login, :remember
|
|
822
|
-
end
|
|
823
|
-
roda do |r|
|
|
824
|
-
r.rodauth
|
|
825
|
-
r.get 'load' do
|
|
826
|
-
rodauth.load_memory
|
|
827
|
-
r.redirect '/'
|
|
828
|
-
end
|
|
829
|
-
r.root{rodauth.logged_in? ? "Logged In#{session[:remembered]}" : "Not Logged In"}
|
|
830
|
-
end
|
|
831
|
-
|
|
832
|
-
visit '/login'
|
|
833
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
834
|
-
fill_in 'Password', :with=>'0123456789'
|
|
835
|
-
click_button 'Login'
|
|
836
|
-
page.body.must_equal 'Logged In'
|
|
837
|
-
|
|
838
|
-
visit '/remember'
|
|
839
|
-
choose 'Remember Me'
|
|
840
|
-
click_button 'Change Remember Setting'
|
|
841
|
-
page.body.must_equal 'Logged In'
|
|
842
|
-
|
|
843
|
-
remove_cookie('rack.session')
|
|
844
|
-
visit '/'
|
|
845
|
-
page.body.must_equal 'Not Logged In'
|
|
846
|
-
|
|
847
|
-
visit '/load'
|
|
848
|
-
page.body.must_equal 'Logged Intrue'
|
|
849
|
-
|
|
850
|
-
key = get_cookie('_remember')
|
|
851
|
-
visit '/remember'
|
|
852
|
-
choose 'Forget Me'
|
|
853
|
-
click_button 'Change Remember Setting'
|
|
854
|
-
page.body.must_equal 'Logged Intrue'
|
|
855
|
-
|
|
856
|
-
remove_cookie('rack.session')
|
|
857
|
-
visit '/'
|
|
858
|
-
page.body.must_equal 'Not Logged In'
|
|
859
|
-
|
|
860
|
-
visit '/load'
|
|
861
|
-
page.body.must_equal 'Not Logged In'
|
|
862
|
-
|
|
863
|
-
set_cookie('_remember', key)
|
|
864
|
-
visit '/load'
|
|
865
|
-
page.body.must_equal 'Logged Intrue'
|
|
866
|
-
|
|
867
|
-
visit '/remember'
|
|
868
|
-
choose 'Disable Remember Me'
|
|
869
|
-
click_button 'Change Remember Setting'
|
|
870
|
-
page.body.must_equal 'Logged Intrue'
|
|
871
|
-
|
|
872
|
-
remove_cookie('rack.session')
|
|
873
|
-
visit '/'
|
|
874
|
-
page.body.must_equal 'Not Logged In'
|
|
875
|
-
|
|
876
|
-
set_cookie('_remember', key)
|
|
877
|
-
visit '/load'
|
|
878
|
-
page.body.must_equal 'Not Logged In'
|
|
879
|
-
end
|
|
880
|
-
|
|
881
|
-
it "should forget remember token when explicitly logging out" do
|
|
95
|
+
it "should have rodauth.features and rodauth.session_value work when not logged in" do
|
|
882
96
|
rodauth do
|
|
883
|
-
enable :login
|
|
884
|
-
end
|
|
885
|
-
roda do |r|
|
|
886
|
-
r.rodauth
|
|
887
|
-
r.get 'load' do
|
|
888
|
-
rodauth.load_memory
|
|
889
|
-
r.redirect '/'
|
|
890
|
-
end
|
|
891
|
-
r.root{rodauth.logged_in? ? "Logged In#{session[:remembered]}" : "Not Logged In"}
|
|
892
|
-
end
|
|
893
|
-
|
|
894
|
-
visit '/login'
|
|
895
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
896
|
-
fill_in 'Password', :with=>'0123456789'
|
|
897
|
-
click_button 'Login'
|
|
898
|
-
page.body.must_equal 'Logged In'
|
|
899
|
-
|
|
900
|
-
visit '/remember'
|
|
901
|
-
choose 'Remember Me'
|
|
902
|
-
click_button 'Change Remember Setting'
|
|
903
|
-
page.body.must_equal 'Logged In'
|
|
904
|
-
|
|
905
|
-
visit '/logout'
|
|
906
|
-
click_button 'Logout'
|
|
907
|
-
|
|
908
|
-
visit '/'
|
|
909
|
-
page.body.must_equal 'Not Logged In'
|
|
910
|
-
|
|
911
|
-
visit '/load'
|
|
912
|
-
page.body.must_equal 'Not Logged In'
|
|
913
|
-
end
|
|
914
|
-
|
|
915
|
-
it "should support clearing remembered flag" do
|
|
916
|
-
rodauth do
|
|
917
|
-
enable :login, :remember
|
|
97
|
+
enable :login
|
|
918
98
|
end
|
|
919
99
|
roda do |r|
|
|
920
|
-
|
|
921
|
-
r.get 'load' do
|
|
922
|
-
rodauth.load_memory
|
|
923
|
-
r.redirect '/'
|
|
924
|
-
end
|
|
925
|
-
r.root{rodauth.logged_in? ? "Logged In#{session[:remembered]}" : "Not Logged In"}
|
|
100
|
+
"#{rodauth.features.first.inspect}#{rodauth.session_value.inspect}"
|
|
926
101
|
end
|
|
927
102
|
|
|
928
|
-
visit '/login'
|
|
929
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
930
|
-
fill_in 'Password', :with=>'0123456789'
|
|
931
|
-
click_button 'Login'
|
|
932
|
-
page.body.must_equal 'Logged In'
|
|
933
|
-
|
|
934
|
-
visit '/remember'
|
|
935
|
-
choose 'Remember Me'
|
|
936
|
-
click_button 'Change Remember Setting'
|
|
937
|
-
page.body.must_equal 'Logged In'
|
|
938
|
-
|
|
939
|
-
remove_cookie('rack.session')
|
|
940
103
|
visit '/'
|
|
941
|
-
page.body.must_equal '
|
|
942
|
-
|
|
943
|
-
visit '/load'
|
|
944
|
-
page.body.must_equal 'Logged Intrue'
|
|
945
|
-
|
|
946
|
-
visit '/remember?confirm=t'
|
|
947
|
-
fill_in 'Password', :with=>'012345678'
|
|
948
|
-
click_button 'Confirm Password'
|
|
949
|
-
page.html.must_match(/invalid password/)
|
|
950
|
-
|
|
951
|
-
fill_in 'Password', :with=>'0123456789'
|
|
952
|
-
click_button 'Confirm Password'
|
|
953
|
-
page.body.must_equal 'Logged In'
|
|
104
|
+
page.body.must_equal ':loginnil'
|
|
954
105
|
end
|
|
955
106
|
|
|
956
|
-
it "should support
|
|
107
|
+
it "should support auth_class_eval for evaluation inside Auth class" do
|
|
957
108
|
rodauth do
|
|
958
|
-
enable :login
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
rodauth.load_memory
|
|
965
|
-
r.redirect '/'
|
|
109
|
+
enable :login
|
|
110
|
+
login_label{foo}
|
|
111
|
+
auth_class_eval do
|
|
112
|
+
def foo
|
|
113
|
+
'Lonig'
|
|
114
|
+
end
|
|
966
115
|
end
|
|
967
|
-
r.root{rodauth.logged_in? ? "Logged In#{session[:remembered]}" : "Not Logged In"}
|
|
968
|
-
end
|
|
969
|
-
|
|
970
|
-
visit '/login'
|
|
971
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
972
|
-
fill_in 'Password', :with=>'0123456789'
|
|
973
|
-
click_button 'Login'
|
|
974
|
-
|
|
975
|
-
visit '/remember'
|
|
976
|
-
choose 'Remember Me'
|
|
977
|
-
click_button 'Change Remember Setting'
|
|
978
|
-
|
|
979
|
-
remove_cookie('rack.session')
|
|
980
|
-
visit '/'
|
|
981
|
-
page.body.must_equal 'Not Logged In'
|
|
982
|
-
|
|
983
|
-
visit '/load'
|
|
984
|
-
page.body.must_equal 'Logged Intrue'
|
|
985
|
-
end
|
|
986
|
-
|
|
987
|
-
it "should support account lockouts" do
|
|
988
|
-
rodauth do
|
|
989
|
-
enable :lockout
|
|
990
|
-
max_invalid_logins 2
|
|
991
116
|
end
|
|
992
117
|
roda do |r|
|
|
993
118
|
r.rodauth
|
|
994
|
-
r.root{view :content=>(rodauth.logged_in? ? "Logged In" : "Not Logged")}
|
|
995
119
|
end
|
|
996
120
|
|
|
997
121
|
visit '/login'
|
|
998
|
-
fill_in '
|
|
999
|
-
fill_in 'Password', :with=>'012345678910'
|
|
1000
|
-
click_button 'Login'
|
|
1001
|
-
page.find('#error_flash').text.must_equal 'There was an error logging in'
|
|
1002
|
-
|
|
1003
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
1004
|
-
fill_in 'Password', :with=>'0123456789'
|
|
1005
|
-
click_button 'Login'
|
|
1006
|
-
page.find('#notice_flash').text.must_equal 'You have been logged in'
|
|
1007
|
-
page.body.must_match(/Logged In/)
|
|
1008
|
-
|
|
1009
|
-
remove_cookie('rack.session')
|
|
1010
|
-
|
|
1011
|
-
visit '/login'
|
|
1012
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
1013
|
-
3.times do
|
|
1014
|
-
fill_in 'Password', :with=>'012345678910'
|
|
1015
|
-
click_button 'Login'
|
|
1016
|
-
page.find('#error_flash').text.must_equal 'There was an error logging in'
|
|
1017
|
-
end
|
|
1018
|
-
page.body.must_match(/This account is currently locked out/)
|
|
1019
|
-
click_button 'Request Account Unlock'
|
|
1020
|
-
page.find('#notice_flash').text.must_equal 'An email has been sent to you with a link to unlock your account'
|
|
1021
|
-
|
|
1022
|
-
link = email_link(/(\/unlock-account\?key=.+)$/)
|
|
1023
|
-
visit link[0...-1]
|
|
1024
|
-
page.find('#error_flash').text.must_equal 'No matching unlock account key'
|
|
1025
|
-
|
|
1026
|
-
visit link
|
|
1027
|
-
click_button 'Unlock Account'
|
|
1028
|
-
page.find('#notice_flash').text.must_equal 'Your account has been unlocked'
|
|
1029
|
-
|
|
1030
|
-
visit '/login'
|
|
1031
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
1032
|
-
fill_in 'Password', :with=>'0123456789'
|
|
1033
|
-
click_button 'Login'
|
|
1034
|
-
page.find('#notice_flash').text.must_equal 'You have been logged in'
|
|
1035
|
-
page.body.must_match(/Logged In/)
|
|
1036
|
-
end
|
|
1037
|
-
|
|
1038
|
-
it "should support autologin when unlocking account" do
|
|
1039
|
-
rodauth do
|
|
1040
|
-
enable :lockout
|
|
1041
|
-
unlock_account_autologin? true
|
|
1042
|
-
end
|
|
1043
|
-
roda do |r|
|
|
1044
|
-
r.rodauth
|
|
1045
|
-
r.root{view :content=>(rodauth.logged_in? ? "Logged In" : "Not Logged")}
|
|
1046
|
-
end
|
|
1047
|
-
|
|
1048
|
-
visit '/login'
|
|
1049
|
-
fill_in 'Login', :with=>'foo@example.com'
|
|
1050
|
-
101.times do |i|
|
|
1051
|
-
fill_in 'Password', :with=>'012345678910'
|
|
1052
|
-
click_button 'Login'
|
|
1053
|
-
page.find('#error_flash').text.must_equal 'There was an error logging in'
|
|
1054
|
-
end
|
|
1055
|
-
page.body.must_match(/This account is currently locked out/)
|
|
1056
|
-
click_button 'Request Account Unlock'
|
|
1057
|
-
page.find('#notice_flash').text.must_equal 'An email has been sent to you with a link to unlock your account'
|
|
1058
|
-
|
|
1059
|
-
link = email_link(/(\/unlock-account\?key=.+)$/)
|
|
1060
|
-
visit link
|
|
1061
|
-
click_button 'Unlock Account'
|
|
1062
|
-
page.body.must_match(/Logged In/)
|
|
1063
|
-
end
|
|
1064
|
-
|
|
1065
|
-
it "should support verifying accounts" do
|
|
1066
|
-
rodauth do
|
|
1067
|
-
enable :login
|
|
1068
|
-
end
|
|
1069
|
-
roda do |r|
|
|
1070
|
-
"#{rodauth.features.first.inspect}#{rodauth.session_value.inspect}"
|
|
1071
|
-
end
|
|
1072
|
-
|
|
1073
|
-
visit '/'
|
|
1074
|
-
page.body.must_equal ':loginnil'
|
|
122
|
+
fill_in 'Lonig', :with=>'foo@example.com'
|
|
1075
123
|
end
|
|
1076
124
|
|
|
1077
125
|
it "should support multiple rodauth configurations in an app" do
|
|
@@ -1096,11 +144,8 @@ describe 'Rodauth' do
|
|
|
1096
144
|
app.freeze
|
|
1097
145
|
self.app = app
|
|
1098
146
|
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
fill_in 'Password', :with=>'0123456789'
|
|
1102
|
-
click_button 'Login'
|
|
1103
|
-
page.body.must_equal Account.first.id.to_s
|
|
147
|
+
login(:path=>'/r1/login')
|
|
148
|
+
page.body.must_equal DB[:accounts].get(:id).to_s
|
|
1104
149
|
|
|
1105
150
|
visit '/r2/logout'
|
|
1106
151
|
click_button 'Logout'
|
|
@@ -1111,4 +156,36 @@ describe 'Rodauth' do
|
|
|
1111
156
|
visit '/r2/login'
|
|
1112
157
|
page.body.must_equal 'r2'
|
|
1113
158
|
end
|
|
159
|
+
|
|
160
|
+
it "should support account_model setting for backwards compatibility" do
|
|
161
|
+
warning = nil
|
|
162
|
+
rodauth do
|
|
163
|
+
enable :login
|
|
164
|
+
(class << self; self end).send(:define_method, :warn){|msg| warning = msg}
|
|
165
|
+
account_model Sequel::Model(DB[:accs].select(:id))
|
|
166
|
+
end
|
|
167
|
+
roda do |r|
|
|
168
|
+
"#{rodauth.accounts_table}#{rodauth.account_select.length}"
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
visit '/'
|
|
172
|
+
page.body.must_equal 'accs1'
|
|
173
|
+
warning.must_equal "account_model is deprecated, use db and accounts_table settings"
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
it "should support account_select setting for choosing account columns" do
|
|
177
|
+
warning = nil
|
|
178
|
+
rodauth do
|
|
179
|
+
enable :login
|
|
180
|
+
account_select [:id, :email]
|
|
181
|
+
end
|
|
182
|
+
roda do |r|
|
|
183
|
+
r.rodauth
|
|
184
|
+
rodauth.account_from_session
|
|
185
|
+
rodauth.account.keys.map(&:to_s).sort.join(' ')
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
login
|
|
189
|
+
page.body.must_equal 'email id'
|
|
190
|
+
end
|
|
1114
191
|
end
|