authpwn_rails 0.13.4 → 0.14.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.
Files changed (48) hide show
  1. data/.travis.yml +4 -2
  2. data/Gemfile +5 -5
  3. data/Gemfile.lock +47 -45
  4. data/Gemfile.rails3 +15 -0
  5. data/Gemfile.rails4 +15 -0
  6. data/VERSION +1 -1
  7. data/app/models/credentials/email.rb +35 -19
  8. data/app/models/credentials/facebook.rb +11 -9
  9. data/app/models/credentials/password.rb +7 -5
  10. data/app/models/tokens/base.rb +27 -14
  11. data/app/models/tokens/email_verification.rb +1 -1
  12. data/app/models/tokens/session_uid.rb +5 -5
  13. data/authpwn_rails.gemspec +15 -15
  14. data/lib/authpwn_rails/credential_model.rb +8 -6
  15. data/lib/authpwn_rails/expires.rb +1 -1
  16. data/lib/authpwn_rails/generators/templates/001_create_users.rb +4 -4
  17. data/lib/authpwn_rails/generators/templates/003_create_credentials.rb +8 -10
  18. data/lib/authpwn_rails/generators/templates/session/password_change.html.erb +1 -1
  19. data/lib/authpwn_rails/generators/templates/session_controller.rb +1 -1
  20. data/lib/authpwn_rails/generators/templates/session_controller_test.rb +9 -9
  21. data/lib/authpwn_rails/http_basic.rb +2 -2
  22. data/lib/authpwn_rails/routes.rb +18 -18
  23. data/lib/authpwn_rails/session.rb +3 -3
  24. data/lib/authpwn_rails/session_controller.rb +39 -25
  25. data/lib/authpwn_rails/session_mailer.rb +5 -5
  26. data/lib/authpwn_rails/test_extensions.rb +6 -6
  27. data/lib/authpwn_rails/user_extensions/email_field.rb +33 -16
  28. data/lib/authpwn_rails/user_extensions/facebook_fields.rb +1 -1
  29. data/lib/authpwn_rails/user_extensions/password_field.rb +17 -14
  30. data/lib/authpwn_rails/user_model.rb +9 -7
  31. data/test/cookie_controller_test.rb +22 -16
  32. data/test/credentials/facebook_credential_test.rb +17 -17
  33. data/test/credentials/password_credential_test.rb +1 -1
  34. data/test/credentials/password_reset_token_test.rb +1 -1
  35. data/test/credentials/session_uid_token_test.rb +1 -0
  36. data/test/credentials/token_crendential_test.rb +2 -4
  37. data/test/facebook_controller_test.rb +14 -14
  38. data/test/helpers/action_controller.rb +8 -0
  39. data/test/helpers/db_setup.rb +11 -9
  40. data/test/helpers/routes.rb +14 -9
  41. data/test/http_basic_controller_test.rb +35 -20
  42. data/test/routes_test.rb +18 -18
  43. data/test/session_controller_api_test.rb +76 -83
  44. data/test/test_helper.rb +4 -1
  45. data/test/user_extensions/email_field_test.rb +1 -1
  46. data/test/user_extensions/facebook_fields_test.rb +5 -5
  47. data/test/user_extensions/password_field_test.rb +2 -2
  48. metadata +14 -27
@@ -1,22 +1,20 @@
1
1
  class CreateCredentials < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :credentials do |t|
4
- t.references :user, :null => false
5
- t.string :type, :limit => 32, :null => false
6
- t.string :name, :limit => 128, :null => true
4
+ t.references :user, null: false
5
+ t.string :type, limit: 32, null: false
6
+ t.string :name, limit: 128, null: true
7
7
 
8
- t.timestamp :updated_at, :null => false
8
+ t.timestamp :updated_at, null: false
9
9
 
10
- t.binary :key, :limit => 2.kilobytes, :null => true
10
+ t.binary :key, limit: 2.kilobytes, null: true
11
11
  end
12
12
 
13
13
  # All the credentials (maybe of a specific type) belonging to a user.
14
- add_index :credentials, [:user_id, :type], :unique => false,
15
- :null => false
14
+ add_index :credentials, [:user_id, :type], unique: false
16
15
  # A specific credential, to find out what user it belongs to.
17
- add_index :credentials, [:type, :name], :unique => true, :null => true
16
+ add_index :credentials, [:type, :name], unique: true
18
17
  # Expired credentials (particularly useful for tokens).
19
- add_index :credentials, [:type, :updated_at], :unique => false,
20
- :null => false
18
+ add_index :credentials, [:type, :updated_at], unique: false
21
19
  end
22
20
  end
@@ -11,7 +11,7 @@
11
11
  <p class="password_age_notice">
12
12
  Your have been using the same password for
13
13
  <span class="password_age">
14
- <%= time_ago_in_words @credential.updated_at, true %>.
14
+ <%= time_ago_in_words @credential.updated_at, :include_seconds => true %>.
15
15
  </span>
16
16
  </p>
17
17
  <% end %>
@@ -34,7 +34,7 @@ class SessionController < ApplicationController
34
34
  format.html do
35
35
  case token
36
36
  when Tokens::EmailVerification
37
- redirect_to session_url, :notice => 'E-mail address confirmed'
37
+ redirect_to session_url, notice: 'E-mail address confirmed'
38
38
  when Tokens::PasswordReset
39
39
  redirect_to change_password_session_url
40
40
  # Handle other token types here.
@@ -20,7 +20,7 @@ class SessionControllerTest < ActionController::TestCase
20
20
  old_token = credentials(:jane_session_token)
21
21
  old_token.updated_at = Time.now - 1.year
22
22
  old_token.save!
23
- post :create, :email => @email_credential.email, :password => 'password'
23
+ post :create, email: @email_credential.email, password: 'password'
24
24
  assert_equal @user, session_current_user, 'session'
25
25
  assert_redirected_to session_url
26
26
  assert_nil Tokens::Base.with_code(old_token.code).first,
@@ -29,7 +29,7 @@ class SessionControllerTest < ActionController::TestCase
29
29
 
30
30
  test "user logged in JSON request" do
31
31
  set_session_current_user @user
32
- get :show, :format => 'json'
32
+ get :show, format: 'json'
33
33
 
34
34
  assert_equal @user.exuid,
35
35
  ActiveSupport::JSON.decode(response.body)['user']['exuid']
@@ -43,7 +43,7 @@ class SessionControllerTest < ActionController::TestCase
43
43
  end
44
44
 
45
45
  test "user not logged in with JSON request" do
46
- get :show, :format => 'json'
46
+ get :show, format: 'json'
47
47
 
48
48
  assert_equal({}, ActiveSupport::JSON.decode(response.body))
49
49
  end
@@ -61,16 +61,16 @@ class SessionControllerTest < ActionController::TestCase
61
61
  end
62
62
 
63
63
  test "e-mail verification link" do
64
- get :token, :code => @token_credential.code
64
+ get :token, code: @token_credential.code
65
65
  assert_redirected_to session_url
66
66
  assert @email_credential.reload.verified?, 'Email not verified'
67
67
  end
68
68
 
69
69
  test "password reset link" do
70
70
  password_credential = credentials(:jane_password)
71
- get :token, :code => credentials(:jane_password_token).code
71
+ get :token, code: credentials(:jane_password_token).code
72
72
  assert_redirected_to change_password_session_url
73
- assert_nil Credential.where(:id => password_credential.id).first,
73
+ assert_nil Credential.where(id: password_credential.id).first,
74
74
  'Password not cleared'
75
75
  end
76
76
 
@@ -93,10 +93,10 @@ class SessionControllerTest < ActionController::TestCase
93
93
  @password_credential.destroy
94
94
  get :password_change
95
95
 
96
- assert_select 'span[class="password_age"]', :count => 0
96
+ assert_select 'span[class="password_age"]', count: 0
97
97
  assert_select 'form[action=?][method="post"]',
98
98
  change_password_session_path do
99
- assert_select 'input[name="old_password"]', :count => 0
99
+ assert_select 'input[name="old_password"]', count: 0
100
100
  assert_select 'input[name=?]', 'credential[password]'
101
101
  assert_select 'input[name=?]', 'credential[password_confirmation]'
102
102
  assert_select 'input[type=submit]'
@@ -107,7 +107,7 @@ class SessionControllerTest < ActionController::TestCase
107
107
  ActionMailer::Base.deliveries = []
108
108
 
109
109
  assert_difference 'Credential.count', 1 do
110
- post :reset_password, :email => @email_credential.email
110
+ post :reset_password, email: @email_credential.email
111
111
  end
112
112
 
113
113
  assert !ActionMailer::Base.deliveries.empty?, 'email generated'
@@ -51,10 +51,10 @@ module HttpBasicControllerInstanceMethods
51
51
 
52
52
  respond_to do |format|
53
53
  format.html do
54
- render 'session/forbidden', :status => :forbidden
54
+ render 'session/forbidden', status: :forbidden
55
55
  end
56
56
  format.json do
57
- render :json => { :error => "You're not allowed to access that" }
57
+ render json: { error: "You're not allowed to access that" }
58
58
  end
59
59
  end
60
60
  end
@@ -22,24 +22,24 @@ module MapperMixin
22
22
  paths = options[:paths] || controller
23
23
  methods = options[:method_names] || 'session'
24
24
 
25
- get "/#{paths}/token/:code", :controller => controller, :action => 'token',
26
- :as => :"token_#{methods}"
27
-
28
- get "/#{paths}", :controller => controller, :action => 'show',
29
- :as => :"#{methods}"
30
- get "/#{paths}/new", :controller => controller, :action => 'new',
31
- :as => :"new_#{methods}"
32
- post "/#{paths}", :controller => controller, :action => 'create'
33
- delete "/#{paths}", :controller => controller, :action => 'destroy'
34
-
35
- get "/#{paths}/change_password", :controller => controller,
36
- :action => 'password_change',
37
- :as => "change_password_#{methods}"
38
- post "/#{paths}/change_password", :controller => controller,
39
- :action => 'change_password'
40
- post "/#{paths}/reset_password", :controller => controller,
41
- :action => 'reset_password',
42
- :as => "reset_password_#{methods}"
25
+ get "/#{paths}/token/:code", controller: controller, action: 'token',
26
+ as: :"token_#{methods}"
27
+
28
+ get "/#{paths}", controller: controller, action: 'show',
29
+ as: :"#{methods}"
30
+ get "/#{paths}/new", controller: controller, action: 'new',
31
+ as: :"new_#{methods}"
32
+ post "/#{paths}", controller: controller, action: 'create'
33
+ delete "/#{paths}", controller: controller, action: 'destroy'
34
+
35
+ get "/#{paths}/change_password", controller: controller,
36
+ action: 'password_change',
37
+ as: "change_password_#{methods}"
38
+ post "/#{paths}/change_password", controller: controller,
39
+ action: 'change_password'
40
+ post "/#{paths}/reset_password", controller: controller,
41
+ action: 'reset_password',
42
+ as: "reset_password_#{methods}"
43
43
  end
44
44
  end
45
45
 
@@ -78,16 +78,16 @@ module ControllerInstanceMethods
78
78
  format.html do
79
79
  @redirect_url = redirect_url
80
80
  if current_user
81
- render 'session/forbidden', :status => :forbidden
81
+ render 'session/forbidden', status: :forbidden
82
82
  else
83
83
  flash[:auth_redirect_url] = redirect_url
84
- render 'session/forbidden', :status => :forbidden
84
+ render 'session/forbidden', status: :forbidden
85
85
  end
86
86
  end
87
87
  format.json do
88
88
  message = current_user ? "You're not allowed to access that" :
89
89
  'Please sign in'
90
- render :json => { :error => message }
90
+ render json: { error: message }
91
91
  end
92
92
  end
93
93
  end
@@ -12,7 +12,7 @@ module SessionController
12
12
 
13
13
  included do
14
14
  skip_filter :authenticate_using_session
15
- authenticates_using_session :except => [:create, :reset_password, :token]
15
+ authenticates_using_session except: [:create, :reset_password, :token]
16
16
 
17
17
  # If set, every successful login will cause a database purge.
18
18
  class_attribute :auto_purge_sessions
@@ -33,20 +33,19 @@ module SessionController
33
33
  welcome
34
34
  unless performed?
35
35
  respond_to do |format|
36
- format.html { render :action => :welcome }
37
- format.json { render :json => {} }
36
+ format.html { render action: :welcome }
37
+ format.json { render json: {} }
38
38
  end
39
39
  end
40
40
  else
41
41
  home
42
42
  unless performed?
43
43
  respond_to do |format|
44
- format.html { render :action => :home }
44
+ format.html { render action: :home }
45
45
  format.json do
46
46
  user_data = @user.as_json
47
47
  user_data = user_data['user'] if @user.class.include_root_in_json
48
- render :json => { :user => user_data,
49
- :csrf => form_authenticity_token }
48
+ render json: { user: user_data, csrf: form_authenticity_token }
50
49
  end
51
50
  end
52
51
  end
@@ -74,16 +73,15 @@ module SessionController
74
73
  if current_user.class.include_root_in_json
75
74
  user_data = user_data['user']
76
75
  end
77
- render :json => { :user => user_data,
78
- :csrf => form_authenticity_token }
76
+ render json: { user: user_data, csrf: form_authenticity_token }
79
77
  end
80
78
  else
81
79
  error_text = bounce_notice_text auth
82
80
  format.html do
83
- redirect_to new_session_url, :flash => { :alert => error_text,
84
- :auth_redirect_url => @redirect_url }
81
+ redirect_to new_session_url, flash: { alert: error_text,
82
+ auth_redirect_url: @redirect_url }
85
83
  end
86
- format.json { render :json => { :error => auth, :text => error_text } }
84
+ format.json { render json: { error: auth, text: error_text } }
87
85
  end
88
86
  end
89
87
  end
@@ -101,17 +99,17 @@ module SessionController
101
99
  respond_to do |format|
102
100
  if user
103
101
  format.html do
104
- redirect_to new_session_url, :alert =>
102
+ redirect_to new_session_url, alert:
105
103
  'Please check your e-mail for instructions'
106
104
  end
107
- format.json { render :json => { } }
105
+ format.json { render json: { } }
108
106
  else
109
107
  error_text = 'Invalid e-mail'
110
108
  format.html do
111
- redirect_to new_session_url, :alert => error_text
109
+ redirect_to new_session_url, alert: error_text
112
110
  end
113
111
  format.json do
114
- render :json => { :error => :not_found, :text => notice }
112
+ render json: { error: :not_found, text: notice }
115
113
  end
116
114
  end
117
115
  end
@@ -129,10 +127,10 @@ module SessionController
129
127
  error_text = bounce_notice_text auth
130
128
  respond_to do |format|
131
129
  format.html do
132
- redirect_to new_session_url, :flash => { :alert => error_text,
133
- :auth_redirect_url => session_url }
130
+ redirect_to new_session_url, flash: { alert: error_text,
131
+ auth_redirect_url: session_url }
134
132
  end
135
- format.json { render :json => { :error => auth, :text => error_text } }
133
+ format.json { render json: { error: auth, text: error_text } }
136
134
  end
137
135
  else
138
136
  self.set_session_current_user auth
@@ -145,8 +143,7 @@ module SessionController
145
143
  if current_user.class.include_root_in_json
146
144
  user_data = user_data['user']
147
145
  end
148
- render :json => { :user => user_data,
149
- :csrf => form_authenticity_token }
146
+ render json: { user: user_data, csrf: form_authenticity_token }
150
147
  end
151
148
  end
152
149
  end
@@ -194,29 +191,46 @@ module SessionController
194
191
  if @credential
195
192
  # An old password is set, must verify it.
196
193
  if @credential.check_password params[:old_password]
197
- success = @credential.update_attributes params[:credential]
194
+ success = @credential.update_attributes(
195
+ change_password_params[:credential])
198
196
  else
199
197
  success = false
200
198
  flash[:alert] = 'Incorrect old password. Please try again.'
201
199
  end
202
200
  else
203
- @credential = Credentials::Password.new params[:credential]
201
+ @credential = Credentials::Password.new(
202
+ change_password_params[:credential])
204
203
  @credential.user = current_user
205
204
  success = @credential.save
206
205
  end
207
206
  respond_to do |format|
208
207
  if success
209
208
  format.html do
210
- redirect_to session_url, :notice => 'Password updated'
209
+ redirect_to session_url, notice: 'Password updated'
211
210
  end
212
211
  format.json { head :ok }
213
212
  else
214
- format.html { render :action => :password_change }
215
- format.json { render :json => { :error => :invalid } }
213
+ format.html { render action: :password_change }
214
+ format.json { render json: { error: :invalid } }
216
215
  end
217
216
  end
218
217
  end
219
218
 
219
+ if defined? ActiveModel::ForbiddenAttributesProtection
220
+ # Rails 4.
221
+
222
+ # Parameters used to change the user's password.
223
+ def change_password_params
224
+ params.permit :format, :old_password,
225
+ credential: [ :password, :password_confirmation ]
226
+ end
227
+ else
228
+ # Rails 3.
229
+ def change_password_params
230
+ params
231
+ end
232
+ end
233
+
220
234
  # True for controllers belonging to the authentication implementation.
221
235
  #
222
236
  # Controllers that return true here are responsible for performing their own
@@ -16,9 +16,9 @@ module SessionMailer
16
16
  @host.slice! -1 if @host[-1] == ?/
17
17
  hostname = @host.split(':', 2).first # Strip out any port.
18
18
 
19
- mail :to => @token.email,
20
- :subject => email_verification_subject(token, hostname, @protocol),
21
- :from => email_verification_from(token, hostname, @protocol)
19
+ mail to: @token.email,
20
+ subject: email_verification_subject(token, hostname, @protocol),
21
+ from: email_verification_from(token, hostname, @protocol)
22
22
  end
23
23
 
24
24
  # The subject line in an e-mail verification e-mail.
@@ -48,8 +48,8 @@ module SessionMailer
48
48
  @host.slice! -1 if @host[-1] == ?/
49
49
 
50
50
  hostname = @host.split(':', 2).first # Strip out any port.
51
- mail :to => email, :from => reset_password_from(token, hostname, @protocol),
52
- :subject => reset_password_subject(token, hostname, @protocol)
51
+ mail to: email, from: reset_password_from(token, hostname, @protocol),
52
+ subject: reset_password_subject(token, hostname, @protocol)
53
53
  end
54
54
 
55
55
  # The subject line in a password reset e-mail.
@@ -11,7 +11,7 @@ module TestExtensions
11
11
  # the credential matches the given argument, and nil otherwise.
12
12
  def with_blocked_credential(blocked_credential, reason = :blocked, &block)
13
13
  # Stub a method in all User instances for this test only.
14
- # flexmock.new_instances doesn't work because ActiveRecord doesn't use new
14
+ # mocha.any_instance doesn't work because ActiveRecord doesn't use new
15
15
  # to instantiate records.
16
16
  ::User.class_eval do
17
17
  alias_method :_auth_bounce_reason_wbc_stub, :auth_bounce_reason
@@ -42,7 +42,7 @@ module ControllerTestExtensions
42
42
  def set_session_current_user(user)
43
43
  if user
44
44
  # Avoid database inserts, if at all possible.
45
- if token = Tokens::SessionUid.where(:user_id => user.id).first
45
+ if token = Tokens::SessionUid.where(user_id: user.id).first
46
46
  token.spend # Only bump updated_at if necessary.
47
47
  else
48
48
  token = Tokens::SessionUid.random_for user, '127.0.0.1', 'UnitTests'
@@ -75,17 +75,17 @@ module ControllerTestExtensions
75
75
 
76
76
  if password.nil?
77
77
  password = 'password'
78
- credential = Credentials::Password.where(:user_id => user.id).first
78
+ credential = Credentials::Password.where(user_id: user.id).first
79
79
  if credential
80
- credential.update_attributes! :password => password
80
+ credential.update_attributes! password: password
81
81
  else
82
- credential = Credentials::Password.new :password => password
82
+ credential = Credentials::Password.new password: password
83
83
  credential.user_id = user.id
84
84
  credential.save!
85
85
  end
86
86
  end
87
87
 
88
- credential = Credentials::Email.where(:user_id => user.id).first
88
+ credential = Credentials::Email.where(user_id: user.id).first
89
89
  unless credential
90
90
  raise RuntimeError, "Can't specify an user without an e-mail"
91
91
  end
@@ -1,4 +1,5 @@
1
1
  require 'active_model'
2
+ require 'active_record'
2
3
  require 'active_support'
3
4
 
4
5
  # :nodoc: namespace
@@ -6,30 +7,46 @@ module Authpwn
6
7
 
7
8
  # :nodoc: namespace
8
9
  module UserExtensions
9
-
10
+
10
11
  # Augments the User model with an email virtual attribute.
11
12
  module EmailField
12
13
  extend ActiveSupport::Concern
13
-
14
+
14
15
  included do
15
- validates :email, :format => /^[A-Za-z0-9.+_]+@[^@]*\.(\w+)$/,
16
- :presence => true
17
- attr_accessible :email
16
+ validates :email, format: /\A[A-Za-z0-9.+_]+@[^@]*\.(\w+)\Z/,
17
+ presence: true
18
+ if ActiveRecord::Base.respond_to? :mass_assignment_sanitizer=
19
+ attr_accessible :email
20
+ end
18
21
  end
19
-
22
+
20
23
  module ClassMethods
21
- # The user who has a certain e-mail, or nil if the e-mail is unclaimed.
22
- def with_email(email)
23
- credential = Credentials::Email.where(:name => email).includes(:user).first
24
- credential && credential.user
24
+ begin
25
+ ActiveRecord::QueryMethods.instance_method :references
26
+ # Rails 4.
27
+
28
+ # The user who has a certain e-mail, or nil if the e-mail is unclaimed.
29
+ def with_email(email)
30
+ credential = Credentials::Email.where(name: email).
31
+ includes(:user).references(:user).first
32
+ credential && credential.user
33
+ end
34
+ rescue NameError
35
+ # Rails 3.
36
+
37
+ def with_email(email)
38
+ credential = Credentials::Email.where(name: email).includes(:user).
39
+ first
40
+ credential && credential.user
41
+ end
25
42
  end
26
43
  end
27
-
44
+
28
45
  # Credentials::Email instance associated with this user.
29
46
  def email_credential
30
47
  credentials.find { |c| c.instance_of?(Credentials::Email) }
31
48
  end
32
-
49
+
33
50
  # The e-mail from the user's Email credential.
34
51
  #
35
52
  # Returns nil if this user has no Email credential.
@@ -37,7 +54,7 @@ module EmailField
37
54
  credential = self.email_credential
38
55
  credential && credential.email
39
56
  end
40
-
57
+
41
58
  # Sets the e-mail on the user's Email credential.
42
59
  #
43
60
  # Creates a new Credentials::Email instance if necessary.
@@ -45,12 +62,12 @@ module EmailField
45
62
  if credential = self.email_credential
46
63
  credential.email = new_email
47
64
  else
48
- credentials << Credentials::Email.new(:email => new_email)
65
+ credentials << Credentials::Email.new(email: new_email)
49
66
  end
50
67
  new_email
51
68
  end
52
69
  end # module Authpwn::UserExtensions::EmailField
53
-
70
+
54
71
  end # module Authpwn::UserExtensions
55
-
72
+
56
73
  end # module Authpwn
@@ -22,7 +22,7 @@ module FacebookFields
22
22
 
23
23
  # The user who has a certain e-mail, or nil if the e-mail is unclaimed.
24
24
  def with_facebook_uid(facebook_uid)
25
- credential = Credentials::Facebook.where(:name => facebook_uid).
25
+ credential = Credentials::Facebook.where(name: facebook_uid).
26
26
  includes(:user).first
27
27
  credential && credential.user
28
28
  end
@@ -6,30 +6,33 @@ module Authpwn
6
6
 
7
7
  # :nodoc: namespace
8
8
  module UserExtensions
9
-
9
+
10
10
  # Augments the User model with a password virtual attribute.
11
11
  module PasswordField
12
12
  extend ActiveSupport::Concern
13
-
13
+
14
14
  included do
15
- validates :password, :presence => { :on => :create },
16
- :confirmation => { :allow_nil => true }
17
- attr_accessible :password, :password_confirmation
15
+ validates :password, presence: { on: :create },
16
+ confirmation: { allow_nil: true }
17
+
18
+ if ActiveRecord::Base.respond_to? :mass_assignment_sanitizer=
19
+ attr_accessible :password, :password_confirmation
20
+ end
18
21
  end
19
-
22
+
20
23
  module ClassMethods
21
24
  # The user who has a certain e-mail, or nil if the e-mail is unclaimed.
22
25
  def with_email(email)
23
- credential = Credentials::Email.where(:name => email).includes(:user).first
26
+ credential = Credentials::Email.where(name: email).includes(:user).first
24
27
  credential && credential.user
25
28
  end
26
29
  end
27
-
30
+
28
31
  # Credentials::Password instance associated with this user.
29
32
  def password_credential
30
33
  credentials.find { |c| c.instance_of?(Credentials::Password) }
31
34
  end
32
-
35
+
33
36
  # The password from the user's Password credential, or nil.
34
37
  #
35
38
  # Returns nil if this user has no Password credential.
@@ -37,7 +40,7 @@ module PasswordField
37
40
  credential = self.password_credential
38
41
  credential && credential.password
39
42
  end
40
-
43
+
41
44
  # The password_confirmation from the user's Password credential, or nil.
42
45
  #
43
46
  # Returns nil if this user has no Password credential.
@@ -53,7 +56,7 @@ module PasswordField
53
56
  if credential = self.password_credential
54
57
  credential.password = new_password
55
58
  else
56
- credentials << Credentials::Password.new(:password => new_password)
59
+ credentials << Credentials::Password.new(password: new_password)
57
60
  end
58
61
  new_password
59
62
  end
@@ -65,13 +68,13 @@ module PasswordField
65
68
  if credential = self.password_credential
66
69
  credential.password_confirmation = new_password_confirmation
67
70
  else
68
- credentials << Credentials::Password.new(:password_confirmation =>
71
+ credentials << Credentials::Password.new(password_confirmation:
69
72
  new_password_confirmation)
70
73
  end
71
74
  new_password_confirmation
72
75
  end
73
76
  end # module Authpwn::UserExtensions::PasswordField
74
-
77
+
75
78
  end # module Authpwn::UserExtensions
76
-
79
+
77
80
  end # module Authpwn
@@ -17,18 +17,20 @@ module UserModel
17
17
  #
18
18
  # This is decoupled from "id" column to avoid leaking information about
19
19
  # the application's usage.
20
- validates :exuid, :presence => true, :length => 1..32, :uniqueness => true
20
+ validates :exuid, presence: true, length: 1..32, uniqueness: true
21
21
 
22
22
  # Credentials used to authenticate the user.
23
- has_many :credentials, :dependent => :destroy, :inverse_of => :user,
24
- :autosave => true
23
+ has_many :credentials, dependent: :destroy, inverse_of: :user,
24
+ autosave: true
25
25
  validates_associated :credentials
26
26
 
27
27
  # Automatically assign exuid.
28
- before_validation :set_default_exuid, :on => :create
28
+ before_validation :set_default_exuid, on: :create
29
29
 
30
- # Forms should not be able to touch any attribute.
31
- attr_accessible :credentials_attributes
30
+ if ActiveRecord::Base.respond_to? :mass_assignment_sanitizer=
31
+ # Forms should not be able to touch any attribute.
32
+ attr_accessible :credentials_attributes
33
+ end
32
34
  end
33
35
 
34
36
  # Class methods on models that include Authpwn::UserModel.
@@ -38,7 +40,7 @@ module UserModel
38
40
  # @param [String] param value returned by User#to_param
39
41
  # @return [ActiveRecord::Relation]
40
42
  def with_param(param)
41
- where(:exuid => param)
43
+ where(exuid: param)
42
44
  end
43
45
 
44
46
  # Queries the database using the value returned by User#to_param.