Skip to content

Commit

Permalink
Fix poll API not requiring authentication on non-public polls (mastod…
Browse files Browse the repository at this point in the history
…on#10960)

* Fix poll API not requiring authentication on non-public polls

That API does not reveal the content of the status, i.e. the question
itself, nor who the author is, nor which status it belongs to, but it
does reveal the poll options and how many answers they got

Fix mastodon#10959

* Add test
  • Loading branch information
Gargron authored and multiple creatures committed Nov 19, 2019
1 parent 0ba9ba5 commit 2982211
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 4 deletions.
17 changes: 16 additions & 1 deletion app/controllers/api/v1/polls_controller.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
# frozen_string_literal: true

class Api::V1::PollsController < Api::BaseController
include Authorization

before_action -> { authorize_if_got_token! :read, :'read:statuses' }, only: :show
before_action :set_poll
before_action :refresh_poll

respond_to :json

def show
render json: @poll, serializer: REST::PollSerializer, include_results: true
end

private

def set_poll
@poll = Poll.attached.find(params[:id])
authorize @poll.status, :show?
rescue Mastodon::NotPermittedError
raise ActiveRecord::RecordNotFound
end

def refresh_poll
ActivityPub::FetchRemotePollService.new.call(@poll, current_account) if user_signed_in? && @poll.possibly_stale?
render json: @poll, serializer: REST::PollSerializer, include_results: true
end
end
18 changes: 15 additions & 3 deletions spec/controllers/api/v1/polls_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,26 @@
before { allow(controller).to receive(:doorkeeper_token) { token } }

describe 'GET #show' do
let(:poll) { Fabricate(:poll) }
let(:poll) { Fabricate(:poll, status: Fabricate(:status, visibility: visibility)) }

before do
get :show, params: { id: poll.id }
end

it 'returns http success' do
expect(response).to have_http_status(200)
context 'when parent status is public' do
let(:visibility) { 'public' }

it 'returns http success' do
expect(response).to have_http_status(200)
end
end

context 'when parent status is private' do
let(:visibility) { 'private' }

it 'returns http not found' do
expect(response).to have_http_status(404)
end
end
end
end

0 comments on commit 2982211

Please sign in to comment.