mirror of
				https://github.com/mastodon/mastodon.git
				synced 2025-10-31 13:18:18 +00:00 
			
		
		
		
	Fix moderator rights inconsistencies (#26729)
This commit is contained in:
		
							parent
							
								
									93d051e47d
								
							
						
					
					
						commit
						b83e487502
					
				
							
								
								
									
										9
									
								
								app/lib/admin/account_statuses_filter.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/lib/admin/account_statuses_filter.rb
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class Admin::AccountStatusesFilter < AccountStatusesFilter | ||||
|   private | ||||
| 
 | ||||
|   def blocked? | ||||
|     false | ||||
|   end | ||||
| end | ||||
|  | @ -140,6 +140,6 @@ class Admin::StatusBatchAction | |||
|   end | ||||
| 
 | ||||
|   def allowed_status_ids | ||||
|     AccountStatusesFilter.new(@report.target_account, current_account).results.with_discarded.where(id: status_ids).pluck(:id) | ||||
|     Admin::AccountStatusesFilter.new(@report.target_account, current_account).results.with_discarded.where(id: status_ids).pluck(:id) | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ class Admin::StatusPolicy < ApplicationPolicy | |||
|   end | ||||
| 
 | ||||
|   def show? | ||||
|     role.can?(:manage_reports, :manage_users) && (record.public_visibility? || record.unlisted_visibility? || record.reported?) | ||||
|     role.can?(:manage_reports, :manage_users) && (record.public_visibility? || record.unlisted_visibility? || record.reported? || viewable_through_normal_policy?) | ||||
|   end | ||||
| 
 | ||||
|   def destroy? | ||||
|  | @ -26,4 +26,10 @@ class Admin::StatusPolicy < ApplicationPolicy | |||
|   def review? | ||||
|     role.can?(:manage_taxonomies) | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
| 
 | ||||
|   def viewable_through_normal_policy? | ||||
|     StatusPolicy.new(current_account, record, @preloaded_relations).show? | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -52,24 +52,36 @@ describe Admin::StatusesController do | |||
|   end | ||||
| 
 | ||||
|   describe 'POST #batch' do | ||||
|     before do | ||||
|       post :batch, params: { :account_id => account.id, action => '', :admin_status_batch_action => { status_ids: status_ids } } | ||||
|     end | ||||
|     subject { post :batch, params: { :account_id => account.id, action => '', :admin_status_batch_action => { status_ids: status_ids } } } | ||||
| 
 | ||||
|     let(:status_ids) { [media_attached_status.id] } | ||||
| 
 | ||||
|     context 'when action is report' do | ||||
|     shared_examples 'when action is report' do | ||||
|       let(:action) { 'report' } | ||||
| 
 | ||||
|       it 'creates a report' do | ||||
|         subject | ||||
| 
 | ||||
|         report = Report.last | ||||
|         expect(report.target_account_id).to eq account.id | ||||
|         expect(report.status_ids).to eq status_ids | ||||
|       end | ||||
| 
 | ||||
|       it 'redirects to report page' do | ||||
|         subject | ||||
| 
 | ||||
|         expect(response).to redirect_to(admin_report_path(Report.last.id)) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     it_behaves_like 'when action is report' | ||||
| 
 | ||||
|     context 'when the moderator is blocked by the author' do | ||||
|       before do | ||||
|         account.block!(user.account) | ||||
|       end | ||||
| 
 | ||||
|       it_behaves_like 'when action is report' | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -7,7 +7,8 @@ describe Admin::StatusPolicy do | |||
|   let(:policy) { described_class } | ||||
|   let(:admin)   { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } | ||||
|   let(:john)    { Fabricate(:account) } | ||||
|   let(:status) { Fabricate(:status) } | ||||
|   let(:status) { Fabricate(:status, visibility: status_visibility) } | ||||
|   let(:status_visibility) { :public } | ||||
| 
 | ||||
|   permissions :index?, :update?, :review?, :destroy? do | ||||
|     context 'with an admin' do | ||||
|  | @ -26,7 +27,7 @@ describe Admin::StatusPolicy do | |||
|   permissions :show? do | ||||
|     context 'with an admin' do | ||||
|       context 'with a public visible status' do | ||||
|         before { allow(status).to receive(:public_visibility?).and_return(true) } | ||||
|         let(:status_visibility) { :public } | ||||
| 
 | ||||
|         it 'permits' do | ||||
|           expect(policy).to permit(admin, status) | ||||
|  | @ -34,11 +35,21 @@ describe Admin::StatusPolicy do | |||
|       end | ||||
| 
 | ||||
|       context 'with a not public visible status' do | ||||
|         before { allow(status).to receive(:public_visibility?).and_return(false) } | ||||
|         let(:status_visibility) { :direct } | ||||
| 
 | ||||
|         it 'denies' do | ||||
|           expect(policy).to_not permit(admin, status) | ||||
|         end | ||||
| 
 | ||||
|         context 'when the status mentions the admin' do | ||||
|           before do | ||||
|             status.mentions.create!(account: admin) | ||||
|           end | ||||
| 
 | ||||
|           it 'permits' do | ||||
|             expect(policy).to permit(admin, status) | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Claire
						Claire