Add moderator role and add pundit policies for admin actions (#5635)
* Add moderator role and add pundit policies for admin actions * Add rake task for turning user into mod and revoking it again * Fix handling of unauthorized exception * Deliver new report e-mails to staff, not just admins * Add promote/demote to admin UI, hide some actions conditionally * Fix unused i18nmain
parent
2b1190065c
commit
7bb8b0b2fc
@ -1,31 +1,41 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Admin::AccountModerationNotesController < Admin::BaseController
|
module Admin
|
||||||
def create
|
class AccountModerationNotesController < BaseController
|
||||||
@account_moderation_note = current_account.account_moderation_notes.new(resource_params)
|
before_action :set_account_moderation_note, only: [:destroy]
|
||||||
if @account_moderation_note.save
|
|
||||||
@target_account = @account_moderation_note.target_account
|
def create
|
||||||
redirect_to admin_account_path(@target_account.id), notice: I18n.t('admin.account_moderation_notes.created_msg')
|
authorize AccountModerationNote, :create?
|
||||||
else
|
|
||||||
@account = @account_moderation_note.target_account
|
@account_moderation_note = current_account.account_moderation_notes.new(resource_params)
|
||||||
@moderation_notes = @account.targeted_moderation_notes.latest
|
|
||||||
render template: 'admin/accounts/show'
|
if @account_moderation_note.save
|
||||||
|
redirect_to admin_account_path(@account_moderation_note.target_account_id), notice: I18n.t('admin.account_moderation_notes.created_msg')
|
||||||
|
else
|
||||||
|
@account = @account_moderation_note.target_account
|
||||||
|
@moderation_notes = @account.targeted_moderation_notes.latest
|
||||||
|
|
||||||
|
render template: 'admin/accounts/show'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
@account_moderation_note = AccountModerationNote.find(params[:id])
|
authorize @account_moderation_note, :destroy?
|
||||||
@target_account = @account_moderation_note.target_account
|
@account_moderation_note.destroy
|
||||||
@account_moderation_note.destroy
|
redirect_to admin_account_path(@account_moderation_note.target_account_id), notice: I18n.t('admin.account_moderation_notes.destroyed_msg')
|
||||||
redirect_to admin_account_path(@target_account.id), notice: I18n.t('admin.account_moderation_notes.destroyed_msg')
|
end
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def resource_params
|
def resource_params
|
||||||
params.require(:account_moderation_note).permit(
|
params.require(:account_moderation_note).permit(
|
||||||
:content,
|
:content,
|
||||||
:target_account_id
|
:target_account_id
|
||||||
)
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_account_moderation_note
|
||||||
|
@account_moderation_note = AccountModerationNote.find(params[:id])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Admin
|
||||||
|
class RolesController < BaseController
|
||||||
|
before_action :set_user
|
||||||
|
|
||||||
|
def promote
|
||||||
|
authorize @user, :promote?
|
||||||
|
@user.promote!
|
||||||
|
redirect_to admin_account_path(@user.account_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def demote
|
||||||
|
authorize @user, :demote?
|
||||||
|
@user.demote!
|
||||||
|
redirect_to admin_account_path(@user.account_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_user
|
||||||
|
@user = Account.find(params[:account_id]).user || raise(ActiveRecord::RecordNotFound)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,17 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AccountModerationNotePolicy < ApplicationPolicy
|
||||||
|
def create?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy?
|
||||||
|
admin? || owner?
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def owner?
|
||||||
|
record.account_id == current_account&.id
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,43 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AccountPolicy < ApplicationPolicy
|
||||||
|
def index?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def show?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def suspend?
|
||||||
|
staff? && !record.user&.staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def unsuspend?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def silence?
|
||||||
|
staff? && !record.user&.staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def unsilence?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def redownload?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def subscribe?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def unsubscribe?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def memorialize?
|
||||||
|
admin? && !record.user&.admin?
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,18 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class ApplicationPolicy
|
||||||
|
attr_reader :current_account, :record
|
||||||
|
|
||||||
|
def initialize(current_account, record)
|
||||||
|
@current_account = current_account
|
||||||
|
@record = record
|
||||||
|
end
|
||||||
|
|
||||||
|
delegate :admin?, :moderator?, :staff?, to: :current_user, allow_nil: true
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def current_user
|
||||||
|
current_account&.user
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,31 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class CustomEmojiPolicy < ApplicationPolicy
|
||||||
|
def index?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def create?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def update?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def copy?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def enable?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,19 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class DomainBlockPolicy < ApplicationPolicy
|
||||||
|
def index?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def show?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def create?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,15 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class EmailDomainBlockPolicy < ApplicationPolicy
|
||||||
|
def index?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def create?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,11 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class InstancePolicy < ApplicationPolicy
|
||||||
|
def index?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def resubscribe?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,15 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class ReportPolicy < ApplicationPolicy
|
||||||
|
def update?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def index?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def show?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,11 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class SettingsPolicy < ApplicationPolicy
|
||||||
|
def update?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def show?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,7 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class SubscriptionPolicy < ApplicationPolicy
|
||||||
|
def index?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,41 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class UserPolicy < ApplicationPolicy
|
||||||
|
def reset_password?
|
||||||
|
staff? && !record.staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable_2fa?
|
||||||
|
admin? && !record.staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def confirm?
|
||||||
|
staff? && !record.confirmed?
|
||||||
|
end
|
||||||
|
|
||||||
|
def enable?
|
||||||
|
admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable?
|
||||||
|
admin? && !record.admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def promote?
|
||||||
|
admin? && promoteable?
|
||||||
|
end
|
||||||
|
|
||||||
|
def demote?
|
||||||
|
admin? && !record.admin? && demoteable?
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def promoteable?
|
||||||
|
!record.staff? || !record.admin?
|
||||||
|
end
|
||||||
|
|
||||||
|
def demoteable?
|
||||||
|
record.staff?
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,15 @@
|
|||||||
|
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
|
||||||
|
|
||||||
|
class AddModeratorToAccounts < ActiveRecord::Migration[5.1]
|
||||||
|
include Mastodon::MigrationHelpers
|
||||||
|
|
||||||
|
disable_ddl_transaction!
|
||||||
|
|
||||||
|
def up
|
||||||
|
safety_assured { add_column_with_default :users, :moderator, :bool, default: false }
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
remove_column :users, :moderator
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in new issue