diff --git a/app/controllers/user_name_change_requests_controller.rb b/app/controllers/user_name_change_requests_controller.rb index c1646f66a..e93278492 100644 --- a/app/controllers/user_name_change_requests_controller.rb +++ b/app/controllers/user_name_change_requests_controller.rb @@ -1,37 +1,25 @@ class UserNameChangeRequestsController < ApplicationController - before_action :member_only, :only => [:index, :show, :new, :create] respond_to :html, :json, :xml def new - @change_request = UserNameChangeRequest.new(change_request_params) + @change_request = authorize UserNameChangeRequest.new(permitted_attributes(UserNameChangeRequest)) respond_with(@change_request) end def create - @change_request = UserNameChangeRequest.create_with(user: CurrentUser.user, original_name: CurrentUser.name).create(change_request_params) + @change_request = authorize UserNameChangeRequest.new(user: CurrentUser.user, original_name: CurrentUser.name) + @change_request.update(permitted_attributes(@change_request)) flash[:notice] = "Your name has been changed" if @change_request.valid? respond_with(@change_request, location: profile_path) end def show - @change_request = UserNameChangeRequest.find(params[:id]) - check_privileges!(@change_request) + @change_request = authorize UserNameChangeRequest.find(params[:id]) respond_with(@change_request) end def index - @change_requests = UserNameChangeRequest.visible(CurrentUser.user).order("id desc").paginate(params[:page], :limit => params[:limit]) + @change_requests = authorize UserNameChangeRequest.visible(CurrentUser.user).order("id desc").paginate(params[:page], :limit => params[:limit]) respond_with(@change_requests) end - - private - - def check_privileges!(change_request) - return if CurrentUser.is_admin? - raise User::PrivilegeError if change_request.user_id != CurrentUser.user.id - end - - def change_request_params - params.fetch(:user_name_change_request, {}).permit(%i[desired_name desired_name_confirmation]) - end end diff --git a/app/models/user.rb b/app/models/user.rb index 7896eb15f..31203ddfd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -322,6 +322,10 @@ class User < ApplicationRecord User.level_string(value || level) end + def is_deleted? + name.match?(/\Auser_[0-9]+~*\z/) + end + def is_anonymous? level == Levels::ANONYMOUS end diff --git a/app/policies/user_name_change_request_policy.rb b/app/policies/user_name_change_request_policy.rb new file mode 100644 index 000000000..a7f38a9cf --- /dev/null +++ b/app/policies/user_name_change_request_policy.rb @@ -0,0 +1,13 @@ +class UserNameChangeRequestPolicy < ApplicationPolicy + def index? + user.is_member? + end + + def show? + user.is_admin? || (user.is_member? && !record.user.is_deleted?) || (record.user == user) + end + + def permitted_attributes + [:desired_name, :desired_name_confirmation] + end +end diff --git a/app/views/static/site_map.html.erb b/app/views/static/site_map.html.erb index 0f81103cd..bdb558770 100644 --- a/app/views/static/site_map.html.erb +++ b/app/views/static/site_map.html.erb @@ -121,7 +121,7 @@ <% else %>