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 i18n
This commit is contained in:
parent
2b1190065c
commit
7bb8b0b2fc
44 changed files with 539 additions and 91 deletions
17
app/policies/account_moderation_note_policy.rb
Normal file
17
app/policies/account_moderation_note_policy.rb
Normal file
|
@ -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
|
43
app/policies/account_policy.rb
Normal file
43
app/policies/account_policy.rb
Normal file
|
@ -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
|
18
app/policies/application_policy.rb
Normal file
18
app/policies/application_policy.rb
Normal file
|
@ -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
|
31
app/policies/custom_emoji_policy.rb
Normal file
31
app/policies/custom_emoji_policy.rb
Normal file
|
@ -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
|
19
app/policies/domain_block_policy.rb
Normal file
19
app/policies/domain_block_policy.rb
Normal file
|
@ -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
|
15
app/policies/email_domain_block_policy.rb
Normal file
15
app/policies/email_domain_block_policy.rb
Normal file
|
@ -0,0 +1,15 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class EmailDomainBlockPolicy < ApplicationPolicy
|
||||
def index?
|
||||
admin?
|
||||
end
|
||||
|
||||
def create?
|
||||
admin?
|
||||
end
|
||||
|
||||
def destroy?
|
||||
admin?
|
||||
end
|
||||
end
|
11
app/policies/instance_policy.rb
Normal file
11
app/policies/instance_policy.rb
Normal file
|
@ -0,0 +1,11 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class InstancePolicy < ApplicationPolicy
|
||||
def index?
|
||||
admin?
|
||||
end
|
||||
|
||||
def resubscribe?
|
||||
admin?
|
||||
end
|
||||
end
|
15
app/policies/report_policy.rb
Normal file
15
app/policies/report_policy.rb
Normal file
|
@ -0,0 +1,15 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ReportPolicy < ApplicationPolicy
|
||||
def update?
|
||||
staff?
|
||||
end
|
||||
|
||||
def index?
|
||||
staff?
|
||||
end
|
||||
|
||||
def show?
|
||||
staff?
|
||||
end
|
||||
end
|
11
app/policies/settings_policy.rb
Normal file
11
app/policies/settings_policy.rb
Normal file
|
@ -0,0 +1,11 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class SettingsPolicy < ApplicationPolicy
|
||||
def update?
|
||||
admin?
|
||||
end
|
||||
|
||||
def show?
|
||||
admin?
|
||||
end
|
||||
end
|
|
@ -1,20 +1,17 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class StatusPolicy
|
||||
attr_reader :account, :status
|
||||
|
||||
def initialize(account, status)
|
||||
@account = account
|
||||
@status = status
|
||||
class StatusPolicy < ApplicationPolicy
|
||||
def index?
|
||||
staff?
|
||||
end
|
||||
|
||||
def show?
|
||||
if direct?
|
||||
owned? || status.mentions.where(account: account).exists?
|
||||
owned? || record.mentions.where(account: current_account).exists?
|
||||
elsif private?
|
||||
owned? || account&.following?(status.account) || status.mentions.where(account: account).exists?
|
||||
owned? || current_account&.following?(author) || record.mentions.where(account: current_account).exists?
|
||||
else
|
||||
account.nil? || !status.account.blocking?(account)
|
||||
current_account.nil? || !author.blocking?(current_account)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -23,26 +20,30 @@ class StatusPolicy
|
|||
end
|
||||
|
||||
def destroy?
|
||||
admin? || owned?
|
||||
staff? || owned?
|
||||
end
|
||||
|
||||
alias unreblog? destroy?
|
||||
|
||||
private
|
||||
|
||||
def admin?
|
||||
account&.user&.admin?
|
||||
def update?
|
||||
staff?
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def direct?
|
||||
status.direct_visibility?
|
||||
record.direct_visibility?
|
||||
end
|
||||
|
||||
def owned?
|
||||
status.account.id == account&.id
|
||||
author.id == current_account&.id
|
||||
end
|
||||
|
||||
def private?
|
||||
status.private_visibility?
|
||||
record.private_visibility?
|
||||
end
|
||||
|
||||
def author
|
||||
record.account
|
||||
end
|
||||
end
|
||||
|
|
7
app/policies/subscription_policy.rb
Normal file
7
app/policies/subscription_policy.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class SubscriptionPolicy < ApplicationPolicy
|
||||
def index?
|
||||
admin?
|
||||
end
|
||||
end
|
41
app/policies/user_policy.rb
Normal file
41
app/policies/user_policy.rb
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue