From 4e1edc92254170d540603edf3cce821b542171cb Mon Sep 17 00:00:00 2001 From: Dhurba baral Date: Wed, 21 Jun 2023 21:07:25 +0545 Subject: [PATCH] allows super_admin user to remove super_admin role (#19590) * Skips scheduled posts in featured post count * Allows removing super_admin role * adds namespace resolution op * Adds pundit policy * Adds rspec for role policy * Fixes test cases and minor refactoring * Removes dead code --------- Co-authored-by: Lawrence --- app/controllers/admin/users_controller.rb | 8 +++--- app/models/role.rb | 6 +++++ app/policies/role_policy.rb | 11 ++++++++ app/services/users/remove_role.rb | 8 ------ .../admin/users/show/overview/_roles.html.erb | 11 +++++--- .../show/overview/_tag_moderation.html.erb | 2 +- config/locales/services/en.yml | 1 - config/locales/services/fr.yml | 1 - config/locales/views/admin/en.yml | 1 + config/locales/views/admin/fr.yml | 1 + .../adminFlows/users/manageRoles.spec.js | 23 ----------------- spec/factories/roles.rb | 5 ++++ spec/models/role_spec.rb | 21 ++++++++++++++++ spec/policies/role_policy_spec.rb | 25 +++++++++++++++++++ spec/requests/admin/users_manage_spec.rb | 25 ++++++------------- spec/services/users/remove_role_spec.rb | 13 ---------- 16 files changed, 92 insertions(+), 70 deletions(-) create mode 100644 app/policies/role_policy.rb create mode 100644 spec/factories/roles.rb create mode 100644 spec/policies/role_policy_spec.rb diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 3139647e0..2bcb2c7b9 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -90,19 +90,21 @@ module Admin end def destroy - role = params[:role].to_sym + role = Role.find(params[:role_id]) + authorize(role, :remove_role?) + resource_type = params[:resource_type] @user = User.find(params[:user_id]) response = ::Users::RemoveRole.call(user: @user, - role: role, + role: role.name, resource_type: resource_type, admin: current_user) if response.success flash[:success] = I18n.t("admin.users_controller.role_removed", - role: role.to_s.humanize.titlecase) # TODO: [@yheuhtozr] need better role i18n + role: role.name.to_s.humanize.titlecase) # TODO: [@yheuhtozr] need better role i18n else flash[:danger] = response.error_message end diff --git a/app/models/role.rb b/app/models/role.rb index 75aed3465..7e0729098 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -19,6 +19,12 @@ class Role < ApplicationRecord workshop_pass ].freeze + ROLES.each do |role| + define_method("#{role}?") do + name == role + end + end + has_and_belongs_to_many :users, join_table: :users_roles # rubocop:disable Rails/HasAndBelongsToMany belongs_to :resource, diff --git a/app/policies/role_policy.rb b/app/policies/role_policy.rb new file mode 100644 index 000000000..e68cb7ab8 --- /dev/null +++ b/app/policies/role_policy.rb @@ -0,0 +1,11 @@ +class RolePolicy < ApplicationPolicy + def remove_role? + return false if record.suspended? + + if user.super_admin? + true + else + user.admin? && !record.super_admin? + end + end +end diff --git a/app/services/users/remove_role.rb b/app/services/users/remove_role.rb index 8eb1a1a90..f7f2c85f7 100644 --- a/app/services/users/remove_role.rb +++ b/app/services/users/remove_role.rb @@ -15,7 +15,6 @@ module Users end def call - return response if super_admin_role?(role) return response if user_current_user?(user) if resource_type && user.remove_role(role, resource_type) @@ -33,13 +32,6 @@ module Users attr_reader :user, :role, :resource_type, :admin, :response - def super_admin_role?(role) - return false if role != :super_admin - - response.error_message = I18n.t("services.users.remove_role.remove_super") - true - end - def user_current_user?(user) return false if user.id != admin.id diff --git a/app/views/admin/users/show/overview/_roles.html.erb b/app/views/admin/users/show/overview/_roles.html.erb index a43a82a4f..3791e711d 100644 --- a/app/views/admin/users/show/overview/_roles.html.erb +++ b/app/views/admin/users/show/overview/_roles.html.erb @@ -17,9 +17,9 @@ <% else %>