def render_empty
render json: {}, status: 200
end
+
+ def authorize_if_got_token!(*scopes)
+ doorkeeper_authorize!(*scopes) if doorkeeper_token
+ end
end
# frozen_string_literal: true
class Api::V1::Accounts::CredentialsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }, except: [:update]
- before_action -> { doorkeeper_authorize! :write }, only: [:update]
+ before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, except: [:update]
+ before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:update]
before_action :require_user!
def show
# frozen_string_literal: true
class Api::V1::Accounts::FollowerAccountsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }
+ before_action -> { doorkeeper_authorize! :read, :'read:accounts' }
before_action :set_account
after_action :insert_pagination_headers
# frozen_string_literal: true
class Api::V1::Accounts::FollowingAccountsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }
+ before_action -> { doorkeeper_authorize! :read, :'read:accounts' }
before_action :set_account
after_action :insert_pagination_headers
# frozen_string_literal: true
class Api::V1::Accounts::ListsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }
+ before_action -> { doorkeeper_authorize! :read, :'read:lists' }
before_action :require_user!
before_action :set_account
# frozen_string_literal: true
class Api::V1::Accounts::RelationshipsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }
+ before_action -> { doorkeeper_authorize! :read, :'read:follows' }
before_action :require_user!
respond_to :json
# frozen_string_literal: true
class Api::V1::Accounts::SearchController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }
+ before_action -> { doorkeeper_authorize! :read, :'read:accounts' }
before_action :require_user!
respond_to :json
# frozen_string_literal: true
class Api::V1::Accounts::StatusesController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }
+ before_action -> { doorkeeper_authorize! :read, :'read:statuses' }
before_action :set_account
after_action :insert_pagination_headers
# frozen_string_literal: true
class Api::V1::AccountsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }, except: [:follow, :unfollow, :block, :unblock, :mute, :unmute]
- before_action -> { doorkeeper_authorize! :follow }, only: [:follow, :unfollow, :block, :unblock, :mute, :unmute]
+ before_action -> { authorize_if_got_token! :read, :'read:accounts' }, except: [:follow, :unfollow, :block, :unblock, :mute, :unmute]
+ before_action -> { doorkeeper_authorize! :follow, :'write:follows' }, only: [:follow, :unfollow]
+ before_action -> { doorkeeper_authorize! :follow, :'write:mutes' }, only: [:mute, :unmute]
+ before_action -> { doorkeeper_authorize! :follow, :'write:blocks' }, only: [:block, :unblock]
+
before_action :require_user!, except: [:show]
before_action :set_account
before_action :check_account_suspension, only: [:show]
# frozen_string_literal: true
class Api::V1::BlocksController < Api::BaseController
- before_action -> { doorkeeper_authorize! :follow }
+ before_action -> { doorkeeper_authorize! :follow, :'read:blocks' }
before_action :require_user!
after_action :insert_pagination_headers
class Api::V1::DomainBlocksController < Api::BaseController
BLOCK_LIMIT = 100
- before_action -> { doorkeeper_authorize! :follow }
+ before_action -> { doorkeeper_authorize! :follow, :'read:blocks' }, only: :show
+ before_action -> { doorkeeper_authorize! :follow, :'write:blocks' }, except: :show
before_action :require_user!
after_action :insert_pagination_headers, only: :show
# frozen_string_literal: true
class Api::V1::FavouritesController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }
+ before_action -> { doorkeeper_authorize! :read, :'read:favourites' }
before_action :require_user!
after_action :insert_pagination_headers
# frozen_string_literal: true
class Api::V1::FiltersController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }, only: [:index, :show]
- before_action -> { doorkeeper_authorize! :write }, except: [:index, :show]
+ before_action -> { doorkeeper_authorize! :read, :'read:filters' }, only: [:index, :show]
+ before_action -> { doorkeeper_authorize! :write, :'write:filters' }, except: [:index, :show]
before_action :require_user!
before_action :set_filters, only: :index
before_action :set_filter, only: [:show, :update, :destroy]
# frozen_string_literal: true
class Api::V1::FollowRequestsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :follow }
+ before_action -> { doorkeeper_authorize! :follow, :'read:follows' }, only: :index
+ before_action -> { doorkeeper_authorize! :follow, :'write:follows' }, except: :index
before_action :require_user!
after_action :insert_pagination_headers, only: :index
# frozen_string_literal: true
class Api::V1::FollowsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :follow }
+ before_action -> { doorkeeper_authorize! :follow, :'write:follows' }
before_action :require_user!
respond_to :json
# frozen_string_literal: true
class Api::V1::Lists::AccountsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }, only: [:show]
- before_action -> { doorkeeper_authorize! :write }, except: [:show]
+ before_action -> { doorkeeper_authorize! :read, :'read:lists' }, only: [:show]
+ before_action -> { doorkeeper_authorize! :write, :'write:lists' }, except: [:show]
before_action :require_user!
before_action :set_list
# frozen_string_literal: true
class Api::V1::ListsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }, only: [:index, :show]
- before_action -> { doorkeeper_authorize! :write }, except: [:index, :show]
+ before_action -> { doorkeeper_authorize! :read, :'read:lists' }, only: [:index, :show]
+ before_action -> { doorkeeper_authorize! :write, :'write:lists' }, except: [:index, :show]
before_action :require_user!
before_action :set_list, except: [:index, :create]
# frozen_string_literal: true
class Api::V1::MediaController < Api::BaseController
- before_action -> { doorkeeper_authorize! :write }
+ before_action -> { doorkeeper_authorize! :write, :'write:media' }
before_action :require_user!
include ObfuscateFilename
# frozen_string_literal: true
class Api::V1::MutesController < Api::BaseController
- before_action -> { doorkeeper_authorize! :follow }
+ before_action -> { doorkeeper_authorize! :follow, :'read:mutes' }
before_action :require_user!
after_action :insert_pagination_headers
# frozen_string_literal: true
class Api::V1::NotificationsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }
+ before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, except: [:clear, :dismiss]
+ before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, only: [:clear, :dismiss]
before_action :require_user!
after_action :insert_pagination_headers, only: :index
# frozen_string_literal: true
class Api::V1::ReportsController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }, except: [:create]
- before_action -> { doorkeeper_authorize! :write }, only: [:create]
+ before_action -> { doorkeeper_authorize! :read, :'read:reports' }, except: [:create]
+ before_action -> { doorkeeper_authorize! :write, :'write:reports' }, only: [:create]
before_action :require_user!
respond_to :json
RESULTS_LIMIT = 5
- before_action -> { doorkeeper_authorize! :read }
+ before_action -> { doorkeeper_authorize! :read, :'read:search' }
before_action :require_user!
respond_to :json
class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController
include Authorization
- before_action :authorize_if_got_token
+ before_action -> { authorize_if_got_token! :read, :'read:accounts' }
before_action :set_status
after_action :insert_pagination_headers
raise ActiveRecord::RecordNotFound
end
- def authorize_if_got_token
- request_token = Doorkeeper::OAuth::Token.from_request(request, *Doorkeeper.configuration.access_token_methods)
- doorkeeper_authorize! :read if request_token
- end
-
def pagination_params(core_params)
params.slice(:limit).permit(:limit).merge(core_params)
end
class Api::V1::Statuses::FavouritesController < Api::BaseController
include Authorization
- before_action -> { doorkeeper_authorize! :write }
+ before_action -> { doorkeeper_authorize! :write, :'write:favourites' }
before_action :require_user!
respond_to :json
class Api::V1::Statuses::MutesController < Api::BaseController
include Authorization
- before_action -> { doorkeeper_authorize! :write }
+ before_action -> { doorkeeper_authorize! :write, :'write:mutes' }
before_action :require_user!
before_action :set_status
before_action :set_conversation
class Api::V1::Statuses::PinsController < Api::BaseController
include Authorization
- before_action -> { doorkeeper_authorize! :write }
+ before_action -> { doorkeeper_authorize! :write, :'write:accounts' }
before_action :require_user!
before_action :set_status
class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController
include Authorization
- before_action :authorize_if_got_token
+ before_action -> { authorize_if_got_token! :read, :'read:accounts' }
before_action :set_status
after_action :insert_pagination_headers
raise ActiveRecord::RecordNotFound
end
- def authorize_if_got_token
- request_token = Doorkeeper::OAuth::Token.from_request(request, *Doorkeeper.configuration.access_token_methods)
- doorkeeper_authorize! :read if request_token
- end
-
def pagination_params(core_params)
params.slice(:limit).permit(:limit).merge(core_params)
end
class Api::V1::Statuses::ReblogsController < Api::BaseController
include Authorization
- before_action -> { doorkeeper_authorize! :write }
+ before_action -> { doorkeeper_authorize! :write, :'write:statuses' }
before_action :require_user!
respond_to :json
class Api::V1::StatusesController < Api::BaseController
include Authorization
- before_action :authorize_if_got_token, except: [:create, :destroy]
- before_action -> { doorkeeper_authorize! :write }, only: [:create, :destroy]
+ before_action -> { authorize_if_got_token! :read, :'read:statuses' }, except: [:create, :destroy]
+ before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:create, :destroy]
before_action :require_user!, except: [:show, :context, :card]
before_action :set_status, only: [:show, :context, :card]
def pagination_params(core_params)
params.slice(:limit).permit(:limit).merge(core_params)
end
-
- def authorize_if_got_token
- request_token = Doorkeeper::OAuth::Token.from_request(request, *Doorkeeper.configuration.access_token_methods)
- doorkeeper_authorize! :read if request_token
- end
end
# frozen_string_literal: true
class Api::V1::Timelines::DirectController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }, only: [:show]
+ before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: [:show]
before_action :require_user!, only: [:show]
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
# frozen_string_literal: true
class Api::V1::Timelines::HomeController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }, only: [:show]
+ before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: [:show]
before_action :require_user!, only: [:show]
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
# frozen_string_literal: true
class Api::V1::Timelines::ListController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read }
+ before_action -> { doorkeeper_authorize! :read, :'read:lists' }
before_action :require_user!
before_action :set_list
before_action :set_statuses
# frozen_string_literal: true
module ApplicationHelper
+ DANGEROUS_SCOPES = %w(
+ read
+ write
+ follow
+ ).freeze
+
def active_nav_class(path)
current_page?(path) ? 'active' : ''
end
Rails.env.production? ? site_title : "#{site_title} (Dev)"
end
+ def class_for_scope(scope)
+ 'scope-danger' if DANGEROUS_SCOPES.include?(scope.to_s)
+ end
+
def can?(action, record)
return false if record.nil?
policy(record).public_send("#{action}?")
display: block;
}
}
+
+.scope-danger {
+ color: $warning-red;
+}
%p.hint= t('doorkeeper.applications.help.native_redirect_uri', native_redirect_uri: Doorkeeper.configuration.native_redirect_uri)
.field-group
- = f.input :scopes,
- label: t('activerecord.attributes.doorkeeper/application.scopes'),
- collection: Doorkeeper.configuration.scopes,
- wrapper: :with_label,
- include_blank: false,
- label_method: lambda { |scope| safe_join([scope, content_tag(:span, t("doorkeeper.scopes.#{scope}"), class: 'hint')]) },
- selected: f.object.scopes.all,
- required: false,
- as: :check_boxes,
- collection_wrapper_tag: 'ul',
- item_wrapper_tag: 'li'
+ .input.with_block_label
+ %label= t('activerecord.attributes.doorkeeper/application.scopes')
+ %span.hint= t('simple_form.hints.defaults.scopes')
+
+ - Doorkeeper.configuration.scopes.group_by { |s| s.split(':').first }.each do |k, v|
+ = f.input :scopes, label: false, hint: false, collection: v.sort, wrapper: :with_block_label, include_blank: false, label_method: lambda { |scope| safe_join([content_tag(:samp, scope, class: class_for_scope(scope)), content_tag(:span, t("doorkeeper.scopes.#{scope}"), class: 'hint')]) }, selected: f.object.scopes.all, required: false, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li'
# For more information go to
# https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes
default_scopes :read
- optional_scopes :write, :follow, :push
+ optional_scopes :write,
+ :'write:accounts',
+ :'write:blocks',
+ :'write:favourites',
+ :'write:filters',
+ :'write:follows',
+ :'write:lists',
+ :'write:media',
+ :'write:mutes',
+ :'write:notifications',
+ :'write:reports',
+ :'write:statuses',
+ :read,
+ :'read:accounts',
+ :'read:blocks',
+ :'read:favourites',
+ :'read:filters',
+ :'read:follows',
+ :'read:lists',
+ :'read:mutes',
+ :'read:notifications',
+ :'read:reports',
+ :'read:search',
+ :'read:statuses',
+ :follow,
+ :push
# Change the way client credentials are retrieved from the request object.
# By default it retrieves first from the `HTTP_AUTHORIZATION` header, then
application:
title: OAuth authorization required
scopes:
- follow: follow, block, unblock and unfollow accounts
- push: receive push notifications for your account
- read: read your account's data
- write: post on your behalf
+ follow: modify account relationships
+ push: receive your push notifications
+ read: read all your account's data
+ read:accounts: see accounts information
+ read:blocks: see your blocks
+ read:favourites: see your favourites
+ read:filters: see your filters
+ read:follows: see your follows
+ read:lists: see your lists
+ read:mutes: see your mutes
+ read:notifications: see your notifications
+ read:reports: see your reports
+ read:search: search on your behalf
+ read:statuses: see all statuses
+ write: modify all your account's data
+ write:accounts: modify your profile
+ write:blocks: block accounts and domains
+ write:favourites: favourite statuses
+ write:filters: create filters
+ write:follows: follow people
+ write:lists: create lists
+ write:media: upload media files
+ write:mutes: mute people and conversations
+ write:notifications: clear your notifications
+ write:reports: report other people
+ write:statuses: publish statuses
one: <span class="note-counter">1</span> character left
other: <span class="note-counter">%{count}</span> characters left
phrase: Will be matched regardless of casing in text or content warning of a toot
+ scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones.
setting_default_language: The language of your toots can be detected automatically, but it's not always accurate
setting_hide_network: Who you follow and who follows you will not be shown on your profile
setting_noindex: Affects your public profile and status pages
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
context 'with an oauth token' do
before do
end
describe 'GET #show' do
+ let(:scopes) { 'read:accounts' }
+
it 'returns http success' do
get :show
expect(response).to have_http_status(200)
end
describe 'PATCH #update' do
+ let(:scopes) { 'write:accounts' }
+
describe 'with valid data' do
before do
allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async)
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') }
before do
Fabricate(:follow, target_account: user.account)
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') }
before do
Fabricate(:follow, account: user.account)
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:lists') }
let(:account) { Fabricate(:account) }
let(:list) { Fabricate(:list, account: user.account) }
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:follows') }
before do
allow(controller).to receive(:doorkeeper_token) { token }
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') }
before do
allow(controller).to receive(:doorkeeper_token) { token }
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses') }
before do
allow(controller).to receive(:doorkeeper_token) { token }
RSpec.describe Api::V1::AccountsController, type: :controller do
render_views
- let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow read') }
+ let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
+ let(:scopes) { '' }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
before do
allow(controller).to receive(:doorkeeper_token) { token }
end
+ shared_examples 'forbidden for wrong scope' do |wrong_scope|
+ let(:scopes) { wrong_scope }
+
+ it 'returns http forbidden' do
+ expect(response).to have_http_status(403)
+ end
+ end
+
describe 'GET #show' do
- it 'returns http success' do
+ let(:scopes) { 'read:accounts' }
+
+ before do
get :show, params: { id: user.account.id }
+ end
+
+ it 'returns http success' do
expect(response).to have_http_status(200)
end
+
+ it_behaves_like 'forbidden for wrong scope', 'write:statuses'
end
describe 'POST #follow' do
+ let(:scopes) { 'write:follows' }
let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', locked: locked)).account }
before do
it 'creates a following relation between user and target user' do
expect(user.account.following?(other_account)).to be true
end
+
+ it_behaves_like 'forbidden for wrong scope', 'read:accounts'
end
context 'with locked account' do
it 'creates a follow request relation between user and target user' do
expect(user.account.requested?(other_account)).to be true
end
+
+ it_behaves_like 'forbidden for wrong scope', 'read:accounts'
end
end
describe 'POST #unfollow' do
+ let(:scopes) { 'write:follows' }
let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
before do
it 'removes the following relation between user and target user' do
expect(user.account.following?(other_account)).to be false
end
+
+ it_behaves_like 'forbidden for wrong scope', 'read:accounts'
end
describe 'POST #block' do
+ let(:scopes) { 'write:blocks' }
let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
before do
it 'creates a blocking relation' do
expect(user.account.blocking?(other_account)).to be true
end
+
+ it_behaves_like 'forbidden for wrong scope', 'read:accounts'
end
describe 'POST #unblock' do
+ let(:scopes) { 'write:blocks' }
let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
before do
it 'removes the blocking relation between user and target user' do
expect(user.account.blocking?(other_account)).to be false
end
+
+ it_behaves_like 'forbidden for wrong scope', 'read:accounts'
end
describe 'POST #mute' do
+ let(:scopes) { 'write:mutes' }
let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
before do
it 'mutes notifications' do
expect(user.account.muting_notifications?(other_account)).to be true
end
+
+ it_behaves_like 'forbidden for wrong scope', 'read:accounts'
end
describe 'POST #mute with notifications set to false' do
+ let(:scopes) { 'write:mutes' }
let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
before do
it 'does not mute notifications' do
expect(user.account.muting_notifications?(other_account)).to be false
end
+
+ it_behaves_like 'forbidden for wrong scope', 'read:accounts'
end
describe 'POST #unmute' do
+ let(:scopes) { 'write:mutes' }
let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
before do
it 'removes the muting relation between user and target user' do
expect(user.account.muting?(other_account)).to be false
end
+
+ it_behaves_like 'forbidden for wrong scope', 'read:accounts'
end
end
RSpec.describe Api::V1::BlocksController, type: :controller do
render_views
- let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') }
+ let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
+ let(:scopes) { 'read:blocks' }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
before { allow(controller).to receive(:doorkeeper_token) { token } }
get :index
expect(response).to have_http_status(200)
end
+
+ context 'with wrong scopes' do
+ let(:scopes) { 'write:blocks' }
+
+ it 'returns http forbidden' do
+ get :index
+ expect(response).to have_http_status(403)
+ end
+ end
end
end
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
before do
user.account.block_domain!('example.com')
allow(controller).to receive(:doorkeeper_token) { token }
end
+ shared_examples 'forbidden for wrong scope' do |wrong_scope|
+ let(:scopes) { wrong_scope }
+
+ it 'returns http forbidden' do
+ expect(response).to have_http_status(403)
+ end
+ end
+
describe 'GET #show' do
+ let(:scopes) { 'read:blocks' }
+
before do
get :show, params: { limit: 1 }
end
it 'returns blocked domains' do
expect(body_as_json.first).to eq 'example.com'
end
+
+ it_behaves_like 'forbidden for wrong scope', 'write:statuses'
end
describe 'POST #create' do
+ let(:scopes) { 'write:blocks' }
+
before do
post :create, params: { domain: 'example.org' }
end
it 'creates a domain block' do
expect(user.account.domain_blocking?('example.org')).to be true
end
+
+ it_behaves_like 'forbidden for wrong scope', 'write:statuses'
end
describe 'DELETE #destroy' do
+ let(:scopes) { 'write:blocks' }
+
before do
delete :destroy, params: { domain: 'example.com' }
end
it 'deletes a domain block' do
expect(user.account.domain_blocking?('example.com')).to be false
end
+
+ it_behaves_like 'forbidden for wrong scope', 'write:statuses'
end
end
context 'with read scope and valid resource owner' do
before do
allow(controller).to receive(:doorkeeper_token) do
- Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read')
+ Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:favourites')
end
end
render_views
let(:user) { Fabricate(:user) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
before do
allow(controller).to receive(:doorkeeper_token) { token }
end
describe 'GET #index' do
+ let(:scopes) { 'read:filters' }
let!(:filter) { Fabricate(:custom_filter, account: user.account) }
it 'returns http success' do
end
describe 'POST #create' do
+ let(:scopes) { 'write:filters' }
+
before do
post :create, params: { phrase: 'magic', context: %w(home), irreversible: true }
end
end
describe 'GET #show' do
+ let(:scopes) { 'read:filters' }
let(:filter) { Fabricate(:custom_filter, account: user.account) }
it 'returns http success' do
end
describe 'PUT #update' do
+ let(:scopes) { 'write:filters' }
let(:filter) { Fabricate(:custom_filter, account: user.account) }
before do
end
describe 'DELETE #destroy' do
+ let(:scopes) { 'write:filters' }
let(:filter) { Fabricate(:custom_filter, account: user.account) }
before do
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice', locked: true)) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:follower) { Fabricate(:account, username: 'bob') }
before do
end
describe 'GET #index' do
+ let(:scopes) { 'read:follows' }
+
before do
get :index, params: { limit: 1 }
end
end
describe 'POST #authorize' do
+ let(:scopes) { 'write:follows' }
+
before do
post :authorize, params: { id: follower.id }
end
end
describe 'POST #reject' do
+ let(:scopes) { 'write:follows' }
+
before do
post :reject, params: { id: follower.id }
end
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:follows') }
before do
allow(controller).to receive(:doorkeeper_token) { token }
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:list) { Fabricate(:list, account: user.account) }
before do
end
describe 'GET #index' do
+ let(:scopes) { 'read:lists' }
+
it 'returns http success' do
get :show, params: { list_id: list.id }
end
describe 'POST #create' do
+ let(:scopes) { 'write:lists' }
let(:bob) { Fabricate(:account, username: 'bob') }
before do
end
describe 'DELETE #destroy' do
+ let(:scopes) { 'write:lists' }
+
before do
delete :destroy, params: { list_id: list.id, account_ids: [list.accounts.first.id] }
end
render_views
let!(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let!(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') }
+ let!(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let!(:list) { Fabricate(:list, account: user.account) }
before { allow(controller).to receive(:doorkeeper_token) { token } }
describe 'GET #index' do
+ let(:scopes) { 'read:lists' }
+
it 'returns http success' do
get :index
expect(response).to have_http_status(200)
end
describe 'GET #show' do
+ let(:scopes) { 'read:lists' }
+
it 'returns http success' do
get :show, params: { id: list.id }
expect(response).to have_http_status(200)
end
describe 'POST #create' do
+ let(:scopes) { 'write:lists' }
+
before do
post :create, params: { title: 'Foo bar' }
end
end
describe 'PUT #update' do
+ let(:scopes) { 'write:lists' }
+
before do
put :update, params: { id: list.id, title: 'Updated title' }
end
end
describe 'DELETE #destroy' do
+ let(:scopes) { 'write:lists' }
+
before do
delete :destroy, params: { id: list.id }
end
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:media') }
before do
allow(controller).to receive(:doorkeeper_token) { token }
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:mutes') }
before do
Fabricate(:mute, account: user.account, hide_notifications: false)
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:other) { Fabricate(:user, account: Fabricate(:account, username: 'bob')) }
before do
end
describe 'GET #show' do
+ let(:scopes) { 'read:notifications' }
+
it 'returns http success' do
notification = Fabricate(:notification, account: user.account)
get :show, params: { id: notification.id }
end
describe 'POST #dismiss' do
+ let(:scopes) { 'write:notifications' }
+
it 'destroys the notification' do
notification = Fabricate(:notification, account: user.account)
post :dismiss, params: { id: notification.id }
end
describe 'POST #clear' do
+ let(:scopes) { 'write:notifications' }
+
it 'clears notifications for the account' do
notification = Fabricate(:notification, account: user.account)
post :clear
end
describe 'GET #index' do
+ let(:scopes) { 'read:notifications' }
+
before do
first_status = PostStatusService.new.call(user.account, 'Test')
@reblog_of_first_status = ReblogService.new.call(other.account, first_status)
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
before do
allow(controller).to receive(:doorkeeper_token) { token }
end
describe 'GET #index' do
+ let(:scopes) { 'read:reports' }
+
it 'returns http success' do
get :index
end
describe 'POST #create' do
+ let(:scopes) { 'write:reports' }
let!(:status) { Fabricate(:status) }
let!(:admin) { Fabricate(:user, admin: true) }
render_views
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:search') }
before do
allow(controller).to receive(:doorkeeper_token) { token }
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app) }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'read:accounts') }
context 'with an oauth token' do
before do
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:favourites', application: app) }
context 'with an oauth token' do
before do
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:mutes', application: app) }
context 'with an oauth token' do
before do
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:accounts', application: app) }
context 'with an oauth token' do
before do
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app) }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'read:accounts') }
context 'with an oauth token' do
before do
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:statuses', application: app) }
context 'with an oauth token' do
before do
let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'write') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: scopes) }
context 'with an oauth token' do
before do
end
describe 'GET #show' do
+ let(:scopes) { 'read:statuses' }
let(:status) { Fabricate(:status, account: user.account) }
it 'returns http success' do
end
describe 'GET #context' do
+ let(:scopes) { 'read:statuses' }
let(:status) { Fabricate(:status, account: user.account) }
before do
end
describe 'POST #create' do
+ let(:scopes) { 'write:statuses' }
+
before do
post :create, params: { status: 'Hello world' }
end
end
describe 'DELETE #destroy' do
+ let(:scopes) { 'write:statuses' }
let(:status) { Fabricate(:status, account: user.account) }
before do
end
context 'with a user context' do
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses') }
describe 'GET #show' do
before do
end
context 'with a user context' do
- let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:lists') }
describe 'GET #show' do
before do
--- /dev/null
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe Api::V2::SearchController, type: :controller do
+ render_views
+
+ let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
+ let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:search') }
+
+ before do
+ allow(controller).to receive(:doorkeeper_token) { token }
+ end
+
+ describe 'GET #index' do
+ it 'returns http success' do
+ get :index, params: { q: 'test' }
+
+ expect(response).to have_http_status(200)
+ end
+ end
+end