Commit f24094442a753a86f58d203627e8894a9603f4b9
1 parent
a7870164
Exists in
master
and in
1 other branch
Avoid user delete admin access of current user logged
Fix #456
Showing
4 changed files
with
59 additions
and
26 deletions
Show diff stats
CHANGELOG.md
... | ... | @@ -5,6 +5,8 @@ |
5 | 5 | - Update some gems ([@shingara][]) |
6 | 6 | - [#492][] Improve some Pjax call ([@nfedyashev][]) |
7 | 7 | - [#428][] Add the support of Unfuddle Tracker ([@parallel588][]) |
8 | +- Avoid to delete his own user ([@shingara][]) | |
9 | +- [#456] Avoid to delete admin access of current user logged ([@shingara][]) | |
8 | 10 | |
9 | 11 | ### Bug Fixes |
10 | 12 | |
... | ... | @@ -48,6 +50,7 @@ |
48 | 50 | [#428]: https://github.com/errbit/errbit/issues/428 |
49 | 51 | [#453]: https://github.com/errbit/errbit/issues/453 |
50 | 52 | [#455]: https://github.com/errbit/errbit/issues/455 |
53 | +[#456]: https://github.com/errbit/errbit/issues/456 | |
51 | 54 | [#457]: https://github.com/errbit/errbit/issues/457 |
52 | 55 | [#460]: https://github.com/errbit/errbit/issues/460 |
53 | 56 | [#466]: https://github.com/errbit/errbit/issues/466 | ... | ... |
app/controllers/users_controller.rb
... | ... | @@ -25,26 +25,25 @@ class UsersController < ApplicationController |
25 | 25 | end |
26 | 26 | |
27 | 27 | def update |
28 | - # Devise Hack | |
29 | - # if params[:user][:password].blank? && params[:user][:password_confirmation].blank? | |
30 | - # params[:user].delete(:password) | |
31 | - # params[:user].delete(:password_confirmation) | |
32 | - # end | |
33 | - | |
34 | 28 | if user.update_attributes(user_params) |
35 | - flash[:success] = "#{user.name}'s information was successfully updated" | |
29 | + flash[:success] = I18n.t('controllers.users.flash.update.success', :name => user.name) | |
36 | 30 | redirect_to user_path(user) |
37 | 31 | else |
38 | 32 | render :edit |
39 | 33 | end |
40 | 34 | end |
41 | 35 | |
36 | + ## | |
37 | + # Destroy the user pass in args | |
38 | + # | |
39 | + # @param [ String ] id the id of user we want delete | |
40 | + # | |
42 | 41 | def destroy |
43 | 42 | if user == current_user |
44 | 43 | flash[:error] = I18n.t('controllers.users.flash.destroy.error') |
45 | 44 | else |
46 | 45 | UserDestroy.new(user).destroy |
47 | - flash[:success] = "That's sad. #{user.name} is no longer part of your team." | |
46 | + flash[:success] = I18n.t('controllers.users.flash.destroy.success', :name => user.name) | |
48 | 47 | end |
49 | 48 | redirect_to users_path |
50 | 49 | end |
... | ... | @@ -62,14 +61,19 @@ class UsersController < ApplicationController |
62 | 61 | end |
63 | 62 | |
64 | 63 | def user_params |
65 | - params[:user] ? params.require(:user).permit(*user_permit_params) : {} | |
64 | + @user_params ||= params[:user] ? params.require(:user).permit(*user_permit_params) : {} | |
66 | 65 | end |
67 | 66 | |
68 | 67 | def user_permit_params |
69 | - @user_permit_params ||= [:name, :username, :email, :github_login, :per_page, :time_zone, :password, :password_confirmation] | |
70 | - @user_permit_params << :admin if current_user.admin? | |
68 | + @user_permit_params ||= [:name,:username, :email, :github_login, :per_page, :time_zone] | |
69 | + @user_permit_params << :admin if current_user.admin? && current_user.id != params[:id] | |
70 | + @user_permit_params |= [:password, :password_confirmation] if user_password_params.values.all?{|pa| !pa.blank? } | |
71 | 71 | @user_permit_params |
72 | 72 | end |
73 | 73 | |
74 | + def user_password_params | |
75 | + @user_password_params ||= params[:user] ? params.require(:user).permit(:password, :password_confirmation) : {} | |
76 | + end | |
77 | + | |
74 | 78 | end |
75 | 79 | ... | ... |
config/locales/en.yml
spec/controllers/users_controller_spec.rb
... | ... | @@ -183,24 +183,18 @@ describe UsersController do |
183 | 183 | |
184 | 184 | context "PUT /users/:id" do |
185 | 185 | context "when the update is successful" do |
186 | + before { | |
187 | + put :update, :id => user.to_param, :user => user_params | |
188 | + } | |
186 | 189 | |
187 | - it "sets a message to display" do | |
188 | - put :update, :id => user.to_param, :user => {:name => 'Kermit'} | |
189 | - request.flash[:success].should include('updated') | |
190 | - end | |
191 | - | |
192 | - it "redirects to the user's page" do | |
193 | - put :update, :id => user.to_param, :user => {:name => 'Kermit'} | |
194 | - response.should redirect_to(user_path(user)) | |
195 | - end | |
196 | - | |
197 | - it "should be able to make user an admin" do | |
198 | - put :update, :id => user.to_param, :user => {:admin => true} | |
199 | - response.should be_redirect | |
200 | - User.find(controller.user.to_param).admin.should be_true | |
190 | + context "with normal params" do | |
191 | + let(:user_params) { {:name => 'Kermit'} } | |
192 | + it "sets a message to display" do | |
193 | + expect(request.flash[:success]).to eq I18n.t('controllers.users.flash.update.success', :name => user.name) | |
194 | + expect(response).to redirect_to(user_path(user)) | |
195 | + end | |
201 | 196 | end |
202 | 197 | end |
203 | - | |
204 | 198 | context "when the update is unsuccessful" do |
205 | 199 | |
206 | 200 | it "renders the edit page" do |
... | ... | @@ -238,6 +232,36 @@ describe UsersController do |
238 | 232 | end |
239 | 233 | end |
240 | 234 | end |
235 | + | |
236 | + describe "#user_params" do | |
237 | + context "with current user not admin" do | |
238 | + before { | |
239 | + controller.stub(:current_user).and_return(user) | |
240 | + controller.stub(:params).and_return(ActionController::Parameters.new(user_param)) | |
241 | + } | |
242 | + let(:user_param) { {'user' => { :name => 'foo', :admin => true }} } | |
243 | + it 'not have admin field' do | |
244 | + expect(controller.send(:user_params)).to eq ({'name' => 'foo'}) | |
245 | + end | |
246 | + context "with password and password_confirmation empty?" do | |
247 | + let(:user_param) { {'user' => { :name => 'foo', 'password' => '', 'password_confirmation' => '' }} } | |
248 | + it 'not have password and password_confirmation field' do | |
249 | + expect(controller.send(:user_params)).to eq ({'name' => 'foo'}) | |
250 | + end | |
251 | + end | |
252 | + end | |
253 | + | |
254 | + context "with current user admin" do | |
255 | + it 'have admin field' | |
256 | + context "with password and password_confirmation empty?" do | |
257 | + it 'not have password and password_confirmation field' | |
258 | + end | |
259 | + context "on his own user" do | |
260 | + it 'not have admin field' | |
261 | + end | |
262 | + end | |
263 | + end | |
264 | + | |
241 | 265 | end |
242 | 266 | |
243 | 267 | end | ... | ... |