devise_invitable 1.4.1 → 1.4.2
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.
Potentially problematic release.
This version of devise_invitable might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG +2 -0
- data/README.rdoc +4 -0
- data/app/controllers/devise/invitations_controller.rb +9 -4
- data/config/locales/en.yml +1 -0
- data/lib/devise_invitable.rb +5 -0
- data/lib/devise_invitable/model.rb +9 -4
- data/lib/devise_invitable/parameter_sanitizer.rb +1 -1
- data/lib/devise_invitable/version.rb +1 -1
- data/lib/generators/devise_invitable/install_generator.rb +5 -0
- data/test/integration/invitation_test.rb +36 -1
- data/test/rails_app/config/application.rb +1 -0
- data/test/rails_app/config/initializers/devise.rb +5 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 751224bca4a80bf6eb364d3c11d58a2771d36acf
|
4
|
+
data.tar.gz: e5a102a756fd4061ee2bffdc345dfc1dd94f15f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7ed72e6393da5bd986570e981d13c3bc3b1d39af6b12c0ebc7499e4b95d838ed8458833f631f766934c46808b2a9c2026a78d307c2f78196b9addecc4541d57
|
7
|
+
data.tar.gz: 5ace95e6bdb544c6e67669d7c6576ba09a74985c92974db6a43a2898b28080cf2bb9d7615acf138969efc24c4949e2149dc1ed51dea4c7512c6933d52c9ccbf5
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
Override valid_password? and unauthenticated_message instead of active_for_authentication? and inactive_message, active_for_authentication? doesn't work for default behavior of invited users without password
|
2
|
+
|
1
3
|
= 1.4.0
|
2
4
|
Override active_for_authentication? and inactive_message instead of valid_password?
|
3
5
|
To use counter_cache, invited_by_counter_cache must be set, no more checking of invitations_count to enable counter cache
|
data/README.rdoc
CHANGED
@@ -132,6 +132,8 @@ or directly as parameters to the <tt>devise</tt> method:
|
|
132
132
|
|
133
133
|
* invited_by_class_name: The class name of the inviting model. If this is nil, polymorphic association is used.
|
134
134
|
|
135
|
+
* allow_insecure_sign_in_after_accept: automatically sign in the user after they set a password. Enabled by default.
|
136
|
+
|
135
137
|
For more details, see <tt>config/initializers/devise.rb</tt> (after you invoked the "devise_invitable:install" generator described above).
|
136
138
|
|
137
139
|
== Configuring views
|
@@ -355,6 +357,7 @@ DeviseInvitable uses flash messages with I18n with the flash keys <tt>:send_inst
|
|
355
357
|
send_instructions: 'An invitation email has been sent to %{email}.'
|
356
358
|
invitation_token_invalid: 'The invitation token provided is not valid!'
|
357
359
|
updated: 'Your password was set successfully. You are now signed in.'
|
360
|
+
updated_not_active: 'Your password was set successfully.'
|
358
361
|
|
359
362
|
You can also create distinct messages based on the resource you've configured using the singular name given in routes:
|
360
363
|
|
@@ -365,6 +368,7 @@ You can also create distinct messages based on the resource you've configured us
|
|
365
368
|
send_instructions: 'A new user invitation has been sent to %{email}.'
|
366
369
|
invitation_token_invalid: 'Your invitation token is not valid!'
|
367
370
|
updated: 'Welcome on board! You are now signed in.'
|
371
|
+
updated_not_active: 'Welcome on board! Sign in to continue.'
|
368
372
|
|
369
373
|
The DeviseInvitable mailer uses the same pattern as Devise to create mail subject messages:
|
370
374
|
|
@@ -43,10 +43,15 @@ class Devise::InvitationsController < DeviseController
|
|
43
43
|
yield resource if block_given?
|
44
44
|
|
45
45
|
if invitation_accepted
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
if Devise.allow_insecure_sign_in_after_accept
|
47
|
+
flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
|
48
|
+
set_flash_message :notice, flash_message if is_flashing_format?
|
49
|
+
sign_in(resource_name, resource)
|
50
|
+
respond_with resource, :location => after_accept_path_for(resource)
|
51
|
+
else
|
52
|
+
set_flash_message :notice, :updated_not_active if is_flashing_format?
|
53
|
+
respond_with resource, :location => new_session_path(resource_name)
|
54
|
+
end
|
50
55
|
else
|
51
56
|
respond_with_navigational(resource){ render :edit }
|
52
57
|
end
|
data/config/locales/en.yml
CHANGED
@@ -6,6 +6,7 @@ en:
|
|
6
6
|
send_instructions: "An invitation email has been sent to %{email}."
|
7
7
|
invitation_token_invalid: "The invitation token provided is not valid!"
|
8
8
|
updated: "Your password was set successfully. You are now signed in."
|
9
|
+
updated_not_active: "Your password was set successfully."
|
9
10
|
no_invitations_remaining: "No invitations remaining"
|
10
11
|
invitation_removed: "Your invitation was removed."
|
11
12
|
new:
|
data/lib/devise_invitable.rb
CHANGED
@@ -66,6 +66,11 @@ module Devise
|
|
66
66
|
# the #invited_by association is declared without counter_cache. (default: nil)
|
67
67
|
mattr_accessor :invited_by_counter_cache
|
68
68
|
@@invited_by_counter_cache = nil
|
69
|
+
|
70
|
+
# Public: Auto-login after the user accepts the invite. If this is false,
|
71
|
+
# the user will need to manually log in after accepting the invite (default: false).
|
72
|
+
mattr_accessor :allow_insecure_sign_in_after_accept
|
73
|
+
@@allow_insecure_sign_in_after_accept = true
|
69
74
|
end
|
70
75
|
|
71
76
|
Devise.add_module :invitable, :controller => :invitations, :model => 'devise_invitable/model', :route => {:invitation => [nil, :new, :accept]}
|
@@ -134,12 +134,12 @@ module Devise
|
|
134
134
|
end
|
135
135
|
|
136
136
|
# Only verify password when is not invited
|
137
|
-
def
|
138
|
-
super unless
|
137
|
+
def valid_password?(password)
|
138
|
+
super unless block_from_invitation?
|
139
139
|
end
|
140
140
|
|
141
|
-
def
|
142
|
-
|
141
|
+
def unauthenticated_message
|
142
|
+
block_from_invitation? ? :invited : super
|
143
143
|
end
|
144
144
|
|
145
145
|
def after_password_reset
|
@@ -179,6 +179,10 @@ module Devise
|
|
179
179
|
@skip_password ||= false
|
180
180
|
end
|
181
181
|
|
182
|
+
def block_from_invitation?
|
183
|
+
invited_to_sign_up?
|
184
|
+
end
|
185
|
+
|
182
186
|
# Checks if the invitation for the user is within the limit time.
|
183
187
|
# We do this by calculating if the difference between today and the
|
184
188
|
# invitation sent date does not exceed the invite for time configured.
|
@@ -303,6 +307,7 @@ module Devise
|
|
303
307
|
Devise::Models.config(self, :invitation_limit)
|
304
308
|
Devise::Models.config(self, :invite_key)
|
305
309
|
Devise::Models.config(self, :resend_invitation)
|
310
|
+
Devise::Models.config(self, :allow_insecure_sign_in_after_accept)
|
306
311
|
end
|
307
312
|
end
|
308
313
|
end
|
@@ -20,7 +20,7 @@ module DeviseInvitable
|
|
20
20
|
def attributes_for_with_invitable(kind)
|
21
21
|
case kind
|
22
22
|
when :invite
|
23
|
-
resource_class.invite_key_fields
|
23
|
+
resource_class.respond_to?(:invite_key_fields) ? resource_class.invite_key_fields : []
|
24
24
|
when :accept_invitation
|
25
25
|
[:password, :password_confirmation, :invitation_token]
|
26
26
|
else attributes_for_without_invitable(kind)
|
@@ -57,6 +57,11 @@ module DeviseInvitable
|
|
57
57
|
# Default: nil
|
58
58
|
# config.invited_by_counter_cache = :invitations_count
|
59
59
|
|
60
|
+
# Auto-login after the user accepts the invite. If this is false,
|
61
|
+
# the user will need to manually log in after accepting the invite.
|
62
|
+
# Default: false
|
63
|
+
# config.allow_insecure_sign_in_after_accept = true
|
64
|
+
|
60
65
|
CONTENT
|
61
66
|
end
|
62
67
|
end
|
@@ -64,6 +64,25 @@ class InvitationTest < ActionDispatch::IntegrationTest
|
|
64
64
|
assert_equal root_path, current_path
|
65
65
|
end
|
66
66
|
|
67
|
+
test 'invited user without password should not be able to sign in' do
|
68
|
+
user = User.invite!(:email => "valid@email.com")
|
69
|
+
user.password = 'test'
|
70
|
+
sign_in_as_user user
|
71
|
+
|
72
|
+
assert_equal new_user_session_path, current_path
|
73
|
+
assert page.has_css?('p#alert', :text => 'You have a pending invitation, accept it to finish creating your account.')
|
74
|
+
end
|
75
|
+
|
76
|
+
test 'invited user with password should not be able to sign in' do
|
77
|
+
user = User.invite!(:email => "valid@email.com")
|
78
|
+
user.password = '987654321'
|
79
|
+
user.save
|
80
|
+
sign_in_as_user user
|
81
|
+
|
82
|
+
assert_equal new_user_session_path, current_path
|
83
|
+
assert page.has_css?('p#alert', :text => 'You have a pending invitation, accept it to finish creating your account.')
|
84
|
+
end
|
85
|
+
|
67
86
|
test 'not authenticated user with invalid invitation token should not be able to set his password' do
|
68
87
|
user = User.invite!(:email => "valid@email.com")
|
69
88
|
user.accept_invitation!
|
@@ -106,10 +125,26 @@ class InvitationTest < ActionDispatch::IntegrationTest
|
|
106
125
|
assert user.reload.valid_password?('987654321')
|
107
126
|
end
|
108
127
|
|
109
|
-
test 'sign in user automatically after setting it\'s password' do
|
128
|
+
test 'sign in user automatically after setting it\'s password if config.allow_insecure_sign_in_after_accept is true' do
|
129
|
+
original_option_value = Devise.allow_insecure_sign_in_after_accept
|
130
|
+
Devise.allow_insecure_sign_in_after_accept = true
|
131
|
+
|
110
132
|
User.invite!(:email => "valid@email.com")
|
111
133
|
set_password :invitation_token => Thread.current[:token]
|
134
|
+
|
112
135
|
assert_equal root_path, current_path
|
136
|
+
Devise.allow_insecure_sign_in_after_accept = original_option_value
|
137
|
+
end
|
138
|
+
|
139
|
+
test 'does not sign in user automatically after setting it\'s password if config.allow_insecure_sign_in_after_accept is false' do
|
140
|
+
original_option_value = Devise.allow_insecure_sign_in_after_accept
|
141
|
+
Devise.allow_insecure_sign_in_after_accept = false
|
142
|
+
|
143
|
+
User.invite!(:email => "valid@email.com")
|
144
|
+
set_password :invitation_token => Thread.current[:token]
|
145
|
+
|
146
|
+
assert_equal new_user_session_path, current_path
|
147
|
+
Devise.allow_insecure_sign_in_after_accept = original_option_value
|
113
148
|
end
|
114
149
|
|
115
150
|
test 'clear token and set invitation_accepted_at after recover password instead of accept_invitation' do
|
@@ -129,6 +129,11 @@ Devise.setup do |config|
|
|
129
129
|
# Default: nil
|
130
130
|
config.invited_by_counter_cache = :invitations_count
|
131
131
|
|
132
|
+
# Auto-login after the user accepts the invite. If this is false,
|
133
|
+
# the user will need to manually log in after accepting the invite.
|
134
|
+
# Default: true
|
135
|
+
# config.allow_insecure_sign_in_after_accept = false
|
136
|
+
|
132
137
|
# ==> Configuration for :confirmable
|
133
138
|
# A period that the user is allowed to access the website even without
|
134
139
|
# confirming his account. For instance, if set to 2.days, the user will be
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise_invitable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergio Cambra
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|