refinerycms-authentication 1.0.11 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. data/app/controllers/refinery/admin/users_controller.rb +100 -0
  2. data/app/controllers/refinery/passwords_controller.rb +51 -0
  3. data/app/controllers/refinery/sessions_controller.rb +26 -0
  4. data/app/controllers/refinery/users_controller.rb +42 -0
  5. data/app/helpers/refinery/sessions_helper.rb +4 -0
  6. data/app/helpers/refinery/users_helper.rb +4 -0
  7. data/app/mailers/refinery/user_mailer.rb +22 -0
  8. data/app/models/refinery/role.rb +18 -0
  9. data/app/models/refinery/roles_users.rb +8 -0
  10. data/app/models/refinery/user.rb +94 -0
  11. data/app/models/refinery/user_plugin.rb +8 -0
  12. data/app/views/refinery/admin/users/_actions.html.erb +6 -0
  13. data/app/views/{admin → refinery/admin}/users/_form.html.erb +15 -19
  14. data/app/views/{admin → refinery/admin}/users/_records.html.erb +1 -1
  15. data/app/views/refinery/admin/users/_user.html.erb +21 -0
  16. data/app/views/refinery/admin/users/_users.html.erb +4 -0
  17. data/app/views/refinery/admin/users/edit.html.erb +1 -0
  18. data/app/views/refinery/admin/users/index.html.erb +6 -0
  19. data/app/views/refinery/admin/users/new.html.erb +1 -0
  20. data/app/views/{layouts → refinery/layouts}/login.html.erb +3 -4
  21. data/app/views/refinery/passwords/edit.html.erb +26 -0
  22. data/app/views/refinery/passwords/new.html.erb +17 -0
  23. data/app/views/{sessions → refinery/sessions}/new.html.erb +6 -8
  24. data/app/views/refinery/user_mailer/reset_notification.html.erb +12 -0
  25. data/app/views/refinery/user_mailer/reset_notification.text.plain.erb +7 -0
  26. data/app/views/refinery/users/new.html.erb +29 -0
  27. data/config/locales/bg.yml +55 -55
  28. data/config/locales/cs.yml +58 -58
  29. data/config/locales/da.yml +55 -55
  30. data/config/locales/de.yml +55 -55
  31. data/config/locales/el.yml +55 -55
  32. data/config/locales/en.yml +55 -55
  33. data/config/locales/es.yml +55 -60
  34. data/config/locales/fi.yml +55 -55
  35. data/config/locales/fr.yml +55 -55
  36. data/config/locales/it.yml +51 -57
  37. data/config/locales/ja.yml +72 -0
  38. data/config/locales/ko.yml +72 -0
  39. data/config/locales/lt.yml +46 -46
  40. data/config/locales/lv.yml +55 -55
  41. data/config/locales/nb.yml +55 -55
  42. data/config/locales/nl.yml +55 -55
  43. data/config/locales/pl.yml +53 -59
  44. data/config/locales/pt-BR.yml +52 -52
  45. data/config/locales/rs.yml +62 -61
  46. data/config/locales/ru.yml +52 -52
  47. data/config/locales/sk.yml +55 -55
  48. data/config/locales/sl.yml +55 -54
  49. data/config/locales/sv.yml +52 -52
  50. data/config/locales/vi.yml +55 -55
  51. data/config/locales/zh-CN.yml +55 -55
  52. data/config/locales/zh-TW.yml +55 -55
  53. data/config/routes.rb +30 -24
  54. data/db/migrate/20100913234705_create_refinerycms_authentication_schema.rb +30 -30
  55. data/lib/refinery/authenticated_system.rb +40 -0
  56. data/lib/refinery/authentication/configuration.rb +9 -0
  57. data/lib/refinery/authentication/engine.rb +36 -0
  58. data/lib/refinery/authentication.rb +29 -0
  59. data/lib/refinerycms-authentication.rb +1 -54
  60. data/refinerycms-authentication.gemspec +14 -109
  61. data/spec/controllers/refinery/admin/users_controller_spec.rb +73 -0
  62. data/spec/factories/user.rb +38 -0
  63. data/spec/models/refinery/user_spec.rb +220 -0
  64. data/spec/requests/refinery/admin/users_spec.rb +49 -0
  65. data/spec/requests/refinery/passwords_spec.rb +84 -0
  66. data/spec/requests/refinery/sessions_spec.rb +62 -0
  67. metadata +109 -124
  68. data/app/controllers/admin/users_controller.rb +0 -86
  69. data/app/controllers/passwords_controller.rb +0 -42
  70. data/app/controllers/sessions_controller.rb +0 -23
  71. data/app/controllers/users_controller.rb +0 -67
  72. data/app/helpers/sessions_helper.rb +0 -2
  73. data/app/helpers/users_helper.rb +0 -2
  74. data/app/mailers/user_mailer.rb +0 -20
  75. data/app/models/role.rb +0 -16
  76. data/app/models/roles_users.rb +0 -6
  77. data/app/models/user.rb +0 -65
  78. data/app/models/user_plugin.rb +0 -6
  79. data/app/views/admin/users/_actions.html.erb +0 -5
  80. data/app/views/admin/users/_user.html.erb +0 -19
  81. data/app/views/admin/users/_users.html.erb +0 -4
  82. data/app/views/admin/users/edit.html.erb +0 -1
  83. data/app/views/admin/users/index.html.erb +0 -6
  84. data/app/views/admin/users/new.html.erb +0 -1
  85. data/app/views/passwords/edit.html.erb +0 -31
  86. data/app/views/passwords/new.html.erb +0 -18
  87. data/app/views/user_mailer/reset_notification.html.erb +0 -12
  88. data/app/views/user_mailer/reset_notification.text.plain.erb +0 -7
  89. data/app/views/users/new.html.erb +0 -41
  90. data/config/locales/jp.yml +0 -72
  91. data/config/locales/lolcat.yml +0 -55
  92. data/db/migrate/20100929035252_add_missing_indexes_to_roles_users.rb +0 -11
  93. data/db/migrate/20101206013505_change_to_devise_users_table.rb +0 -27
  94. data/db/migrate/20110106184757_add_remember_created_at_to_users.rb +0 -9
  95. data/db/migrate/20110325213325_remove_password_salt_from_users.rb +0 -13
  96. data/features/lost_password.feature +0 -49
  97. data/features/manage_users.feature +0 -88
  98. data/features/step_definitions/lost_password.rb +0 -8
  99. data/features/step_definitions/user_steps.rb +0 -41
  100. data/features/support/factories.rb +0 -32
  101. data/features/support/paths.rb +0 -24
  102. data/lib/authenticated_system.rb +0 -29
  103. data/lib/gemspec.rb +0 -38
  104. data/lib/generators/refinerycms_authentication_generator.rb +0 -8
  105. data/spec/models/user_spec.rb +0 -152
@@ -0,0 +1,38 @@
1
+ # This is a temporary hack to get around some hackery with Devise when
2
+ # using the authentication macros in request specs that are defined in
3
+ # refinerycms-testing. If you remove this line ensure that tests pass
4
+ # in an extension that is testing against this Factory via the
5
+ # authentication macros in refinerycms-testing.
6
+ # 10-11-2011 - Jamie Winsor - jamie@enmasse.com
7
+ require Refinery.roots(:'refinery/authentication').join("app/models/refinery/role.rb")
8
+
9
+ FactoryGirl.define do
10
+ factory :user, :class => Refinery::User do
11
+ sequence(:username) { |n| "refinery#{n}" }
12
+ sequence(:email) { |n| "refinery#{n}@refinerycms.com" }
13
+ password "refinerycms"
14
+ password_confirmation "refinerycms"
15
+ end
16
+
17
+ factory :refinery_user, :parent => :user do
18
+ roles { [ ::Refinery::Role[:refinery] ] }
19
+
20
+ after_create do |user|
21
+ ::Refinery::Plugins.registered.each_with_index do |plugin, index|
22
+ user.plugins.create(:name => plugin.name, :position => index)
23
+ end
24
+ end
25
+ end
26
+
27
+ factory :refinery_superuser, :parent => :refinery_user do
28
+ roles { [ ::Refinery::Role[:refinery], ::Refinery::Role[:superuser] ]}
29
+ end
30
+
31
+ factory :refinery_translator, :parent => :user do
32
+ roles { [ ::Refinery::Role[:refinery], ::Refinery::Role[:translator] ] }
33
+
34
+ after_create do |user|
35
+ user.plugins.create(:name => 'refinery_pages', :position => 0)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,220 @@
1
+ require 'spec_helper'
2
+
3
+ module Refinery
4
+ describe User do
5
+
6
+ let(:user) { FactoryGirl.create(:user) }
7
+ let(:refinery_user) { FactoryGirl.create(:refinery_user) }
8
+
9
+ context "Roles" do
10
+ context "add_role" do
11
+ it "raises Exception when Role object is passed" do
12
+ proc {user.add_role(Refinery::Role.new)}.should raise_exception
13
+ end
14
+
15
+ it "adds a Role to the User when role not yet assigned to User" do
16
+ proc {
17
+ user.add_role(:new_role)
18
+ }.should change(user.roles, :count).by(1)
19
+ user.roles.collect(&:title).should include("NewRole")
20
+ end
21
+
22
+ it "does not add a Role to the User when this Role is already assigned to User" do
23
+ proc {
24
+ refinery_user.add_role(:refinery)
25
+ }.should_not change(refinery_user.roles, :count).by(1)
26
+ refinery_user.roles.collect(&:title).should include("Refinery")
27
+ end
28
+ end
29
+
30
+ context "has_role" do
31
+ it "raises Exception when Role object is passed" do
32
+ proc{ user.has_role?(Refinery::Role.new)}.should raise_exception
33
+ end
34
+
35
+ it "returns the true if user has Role" do
36
+ refinery_user.has_role?(:refinery).should be_true
37
+ end
38
+
39
+ it "returns false if user hasn't the Role" do
40
+ refinery_user.has_role?(:refinery_fail).should be_false
41
+ end
42
+ end
43
+
44
+ describe "role association" do
45
+ it "have a roles attribute" do
46
+ user.should respond_to(:roles)
47
+ end
48
+ end
49
+ end
50
+
51
+ context "validations" do
52
+ # email and password validations are done by including devises validatable
53
+ # module so those validations are not tested here
54
+ let(:attr) do
55
+ {
56
+ :username => "Refinery CMS",
57
+ :email => "refinery@cms.com",
58
+ :password => "123456",
59
+ :password_confirmation => "123456"
60
+ }
61
+ end
62
+
63
+ it "requires username" do
64
+ User.new(attr.merge(:username => "")).should_not be_valid
65
+ end
66
+
67
+ it "rejects duplicate usernames" do
68
+ User.create!(attr)
69
+ User.new(attr.merge(:email => "another@email.com")).should_not be_valid
70
+ end
71
+ end
72
+
73
+ describe ".find_for_database_authentication" do
74
+ it "finds user either by username or email" do
75
+ User.find_for_database_authentication(:login => user.username).should == user
76
+ User.find_for_database_authentication(:login => user.email).should == user
77
+ end
78
+ end
79
+
80
+ describe "#can_delete?" do
81
+ let(:user_not_persisted) { FactoryGirl.build(:refinery_user) }
82
+ let(:super_user) do
83
+ super_user = FactoryGirl.create(:refinery_user)
84
+ super_user.add_role(:superuser)
85
+ super_user
86
+ end
87
+
88
+ context "won't allow to delete" do
89
+ it "not persisted user record" do
90
+ refinery_user.can_delete?(user_not_persisted).should be_false
91
+ end
92
+
93
+ it "user with superuser role" do
94
+ refinery_user.can_delete?(super_user).should be_false
95
+ end
96
+
97
+ it "if user count with refinery role < 1" do
98
+ ::Refinery::Role[:refinery].users.delete([ refinery_user, super_user ])
99
+ super_user.can_delete?(refinery_user).should be_false
100
+ end
101
+
102
+ it "user himself" do
103
+ refinery_user.can_delete?(refinery_user).should be_false
104
+ end
105
+ end
106
+
107
+ context "allow to delete" do
108
+ it "if user count with refinery role = 1" do
109
+ ::Refinery::Role[:refinery].users.delete(refinery_user)
110
+ super_user.can_delete?(refinery_user).should be_true
111
+ end
112
+
113
+ it "if all conditions return true" do
114
+ super_user.can_delete?(refinery_user).should be_true
115
+ end
116
+ end
117
+ end
118
+
119
+ describe "#can_edit?" do
120
+ let(:user_not_persisted) { FactoryGirl.build(:refinery_user) }
121
+ let(:super_user) do
122
+ super_user = FactoryGirl.create(:refinery_user)
123
+ super_user.add_role(:superuser)
124
+ super_user
125
+ end
126
+ let(:user_persisted) { FactoryGirl.create(:refinery_user)}
127
+
128
+ context "won't allow to edit" do
129
+ it "non-persisted user record" do
130
+ refinery_user.can_edit?(user_not_persisted).should be_false
131
+ end
132
+
133
+ it "user is not a super user" do
134
+ refinery_user.can_edit?(user_persisted).should be_false
135
+ end
136
+ end
137
+
138
+ context "allows to edit" do
139
+ it "when I am a user super" do
140
+ super_user.can_edit?(user_persisted).should be_true
141
+ end
142
+
143
+ it "if all conditions return true" do
144
+ super_user.can_edit?(refinery_user).should be_true
145
+ end
146
+ end
147
+ end
148
+
149
+ describe "#plugins=" do
150
+ it "assigns plugins to user" do
151
+ plugin_list = ["refinery_one", "refinery_two", "refinery_three"]
152
+ user.plugins = plugin_list
153
+ user.plugins.collect { |p| p.name }.should == plugin_list
154
+ end
155
+ end
156
+
157
+ describe "#authorized_plugins" do
158
+ it "returns array of user and always allowd plugins" do
159
+ ["refinery_one", "refinery_two", "refinery_three"].each_with_index do |name, index|
160
+ user.plugins.create!(:name => name, :position => index)
161
+ end
162
+ user.authorized_plugins.should == user.plugins.collect { |p| p.name } | ::Refinery::Plugins.always_allowed.names
163
+ end
164
+ end
165
+
166
+ describe "plugins association" do
167
+ let(:plugin_list) { ["refinery_one", "refinery_two", "refinery_three"] }
168
+ before { user.plugins = plugin_list }
169
+
170
+ it "have a plugins attribute" do
171
+ user.should respond_to(:plugins)
172
+ end
173
+
174
+ it "returns plugins in ASC order" do
175
+ user.plugins[0].name.should == plugin_list[0]
176
+ user.plugins[1].name.should == plugin_list[1]
177
+ user.plugins[2].name.should == plugin_list[2]
178
+ end
179
+
180
+ it "deletes associated plugins" do
181
+ user.destroy
182
+ UserPlugin.find_by_user_id(user.id).should be_nil
183
+ end
184
+ end
185
+
186
+ describe "#create_first" do
187
+ let(:first_user) do
188
+ first = FactoryGirl.build(:user)
189
+ first.create_first
190
+ first
191
+ end
192
+
193
+ it "adds refinery role" do
194
+ first_user.roles.collect(&:title).should include("Refinery")
195
+ end
196
+
197
+ it "adds superuser role" do
198
+ first_user.roles.collect(&:title).should include("Superuser")
199
+ end
200
+
201
+ it "adds registered plugins" do
202
+ first_user.plugins.collect(&:name).should eq(
203
+ ["refinery_users", "refinery_dashboard", "refinery_images",
204
+ "refinery_files", "refinery_pages"]
205
+ )
206
+ end
207
+
208
+ it "returns true on success" do
209
+ first_user.stub(:valid?).and_return(true)
210
+ first_user.create_first.should == true
211
+ end
212
+
213
+ it "returns false on failure" do
214
+ first_user.stub(:valid?).and_return(false)
215
+ first_user.create_first.should == false
216
+ end
217
+ end
218
+
219
+ end
220
+ end
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe "manage users" do
4
+ login_refinery_user
5
+
6
+ describe "new/create" do
7
+ it "allows to create user" do
8
+ visit refinery.admin_users_path
9
+ click_link "Add new user"
10
+
11
+ fill_in "Username", :with => "test"
12
+ fill_in "Email", :with => "test@refinerycms.com"
13
+ fill_in "Password", :with => "123456"
14
+ fill_in "Password confirmation", :with => "123456"
15
+ click_button "Save"
16
+
17
+ page.should have_content("test was successfully added.")
18
+ page.should have_content("test (test@refinerycms.com)")
19
+ end
20
+ end
21
+
22
+ describe "edit/update" do
23
+ it "allows to update user" do
24
+ visit refinery.admin_users_path
25
+ click_link "Edit this user"
26
+
27
+ fill_in "Username", :with => "cmsrefinery"
28
+ fill_in "Email", :with => "cms@refinerycms.com"
29
+ click_button "Save"
30
+
31
+ page.should have_content("cmsrefinery was successfully updated.")
32
+ page.should have_content("cmsrefinery (cms@refinerycms.com)")
33
+ end
34
+ end
35
+
36
+ describe "destroy" do
37
+ let!(:user) { FactoryGirl.create(:user, :username => "ugisozols") }
38
+
39
+ it "allows to destroy only regular user" do
40
+ visit refinery.admin_users_path
41
+ page.should have_selector("a[href='/refinery/users/#{user.username}']")
42
+ page.should have_no_selector("a[href='/refinery/users/refinerycms']")
43
+
44
+ click_link "Remove this user"
45
+ page.should have_content("'#{user.username}' was successfully removed.")
46
+ page.should have_content("refinerycms (refinerycms@refinerycms.com)")
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,84 @@
1
+ require "spec_helper"
2
+
3
+ module Refinery
4
+ module Users
5
+ describe "password recovery" do
6
+ let!(:user) { FactoryGirl.create(:refinery_user, :email => "refinery@refinerycms.com") }
7
+
8
+ it "asks user to specify email address" do
9
+ visit refinery.new_refinery_user_session_path
10
+ click_link "I forgot my password"
11
+ page.should have_content("Please enter the email address for your account.")
12
+ end
13
+
14
+ context "when existing email specified" do
15
+ it "shows success message" do
16
+ visit refinery.new_refinery_user_password_path
17
+ fill_in "refinery_user_email", :with => user.email
18
+ click_button "Reset password"
19
+ page.should have_content("An email has been sent to you with a link to reset your password.")
20
+ end
21
+ end
22
+
23
+ context "when non-existing email specified" do
24
+ it "shows failure message" do
25
+ visit refinery.new_refinery_user_password_path
26
+ fill_in "refinery_user_email", :with => "none@refinerycms.com"
27
+ click_button "Reset password"
28
+ page.should have_content("Sorry, 'none@refinerycms.com' isn't associated with any accounts.")
29
+ page.should have_content("Are you sure you typed the correct email address?")
30
+ end
31
+ end
32
+
33
+ context "when good reset code" do
34
+ before do
35
+ user.reset_password_sent_at = 5.minutes.ago
36
+ user.reset_password_token = "refinerycms"
37
+ user.save
38
+ end
39
+
40
+ it "allows to change password" do
41
+ visit refinery.edit_refinery_user_password_path(:reset_password_token => user.reset_password_token)
42
+ page.should have_content("Pick a new password for #{user.email}")
43
+
44
+ fill_in "refinery_user_password", :with => "123456"
45
+ fill_in "refinery_user_password_confirmation", :with => "123456"
46
+ click_button "Reset password"
47
+
48
+ page.should have_content("Password reset successfully for '#{user.email}'")
49
+ end
50
+ end
51
+
52
+ context "when invalid reset code" do
53
+ before do
54
+ user.reset_password_sent_at = 5.minutes.ago
55
+ user.reset_password_token = "refinerycms"
56
+ user.save
57
+ end
58
+
59
+ it "shows error message" do
60
+ visit refinery.edit_refinery_user_password_path(:reset_password_token => "hmmm")
61
+ page.should have_content("We're sorry, but this reset code has expired or is invalid.")
62
+ end
63
+ end
64
+
65
+ context "when expired reset code" do
66
+ before do
67
+ user.reset_password_sent_at = 1.day.ago
68
+ user.reset_password_token = "refinerycms"
69
+ user.save
70
+ end
71
+
72
+ it "shows error message" do
73
+ visit refinery.edit_refinery_user_password_path(:reset_password_token => "refinerycms")
74
+
75
+ fill_in "refinery_user_password", :with => "123456"
76
+ fill_in "refinery_user_password_confirmation", :with => "123456"
77
+ click_button "Reset password"
78
+
79
+ page.should have_content("Reset password token has expired, please request a new one")
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,62 @@
1
+ require "spec_helper"
2
+
3
+ module Refinery
4
+ describe "sign in" do
5
+ before(:each) do
6
+ FactoryGirl.create(:refinery_user, :username => "ugisozols",
7
+ :password => "123456",
8
+ :password_confirmation => "123456")
9
+ visit refinery.new_refinery_user_session_path
10
+ end
11
+
12
+ it "shows login form" do
13
+ page.should have_content("Hello! Please sign in.")
14
+ page.should have_content("I forgot my password")
15
+ page.should have_selector("a[href*='/refinery/users/password/new']")
16
+ end
17
+
18
+ context "when supplied data is valid" do
19
+ it "logs in user" do
20
+ fill_in "Login", :with => "ugisozols"
21
+ fill_in "Password", :with => "123456"
22
+ click_button "Sign in"
23
+ page.should have_content("Signed in successfully.")
24
+ end
25
+ end
26
+
27
+ context "when supplied data is not valid" do
28
+ it "shows flash error" do
29
+ fill_in "Login", :with => "Hmmm"
30
+ fill_in "Password", :with => "Hmmm"
31
+ click_button "Sign in"
32
+ page.should have_content("Sorry, your login or password was incorrect.")
33
+ end
34
+ end
35
+ end
36
+
37
+ describe 'user sign up' do
38
+ before(:each) do
39
+ User.delete_all
40
+ end
41
+
42
+ describe 'when there are no users' do
43
+ it 'allows user creation' do
44
+ # Verify that we can access the sign up page.
45
+ visit refinery.root_path
46
+ page.should have_content("There are no users yet, so we'll set you up first")
47
+
48
+ # Fill in user details.
49
+ fill_in 'Username', :with => 'rspec'
50
+ fill_in 'Email', :with => 'rspec@example.com'
51
+ fill_in 'Password', :with => 'spectacular'
52
+ fill_in 'Password confirmation', :with => 'spectacular'
53
+
54
+ # Sign up and verify!
55
+ click_button "Sign up"
56
+ page.should have_content("Welcome to Refinery, rspec.")
57
+ page.should have_content("Latest Activity")
58
+ User.count.should == 1
59
+ end
60
+ end
61
+ end
62
+ end