Browse Source

Add more granular OAuth scopes (#7929)

* Add more granular OAuth scopes

* Add human-readable descriptions of the new scopes

* Ensure new scopes look good on the app UI

* Add tests

* Group scopes in screen and color-code dangerous ones

* Fix wrong extra scope
master
Eugen Rochko 5 years ago
committed by GitHub
parent
commit
1f6ed4f86a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
69 changed files with 292 additions and 102 deletions
  1. +4
    -0
      app/controllers/api/base_controller.rb
  2. +2
    -2
      app/controllers/api/v1/accounts/credentials_controller.rb
  3. +1
    -1
      app/controllers/api/v1/accounts/follower_accounts_controller.rb
  4. +1
    -1
      app/controllers/api/v1/accounts/following_accounts_controller.rb
  5. +1
    -1
      app/controllers/api/v1/accounts/lists_controller.rb
  6. +1
    -1
      app/controllers/api/v1/accounts/relationships_controller.rb
  7. +1
    -1
      app/controllers/api/v1/accounts/search_controller.rb
  8. +1
    -1
      app/controllers/api/v1/accounts/statuses_controller.rb
  9. +5
    -2
      app/controllers/api/v1/accounts_controller.rb
  10. +1
    -1
      app/controllers/api/v1/blocks_controller.rb
  11. +2
    -1
      app/controllers/api/v1/domain_blocks_controller.rb
  12. +1
    -1
      app/controllers/api/v1/favourites_controller.rb
  13. +2
    -2
      app/controllers/api/v1/filters_controller.rb
  14. +2
    -1
      app/controllers/api/v1/follow_requests_controller.rb
  15. +1
    -1
      app/controllers/api/v1/follows_controller.rb
  16. +2
    -2
      app/controllers/api/v1/lists/accounts_controller.rb
  17. +2
    -2
      app/controllers/api/v1/lists_controller.rb
  18. +1
    -1
      app/controllers/api/v1/media_controller.rb
  19. +1
    -1
      app/controllers/api/v1/mutes_controller.rb
  20. +2
    -1
      app/controllers/api/v1/notifications_controller.rb
  21. +2
    -2
      app/controllers/api/v1/reports_controller.rb
  22. +1
    -1
      app/controllers/api/v1/search_controller.rb
  23. +1
    -6
      app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb
  24. +1
    -1
      app/controllers/api/v1/statuses/favourites_controller.rb
  25. +1
    -1
      app/controllers/api/v1/statuses/mutes_controller.rb
  26. +1
    -1
      app/controllers/api/v1/statuses/pins_controller.rb
  27. +1
    -6
      app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb
  28. +1
    -1
      app/controllers/api/v1/statuses/reblogs_controller.rb
  29. +2
    -7
      app/controllers/api/v1/statuses_controller.rb
  30. +1
    -1
      app/controllers/api/v1/timelines/direct_controller.rb
  31. +1
    -1
      app/controllers/api/v1/timelines/home_controller.rb
  32. +1
    -1
      app/controllers/api/v1/timelines/list_controller.rb
  33. +10
    -0
      app/helpers/application_helper.rb
  34. +4
    -0
      app/javascript/styles/mastodon/forms.scss
  35. +6
    -11
      app/views/settings/applications/_fields.html.haml
  36. +26
    -1
      config/initializers/doorkeeper.rb
  37. +26
    -4
      config/locales/doorkeeper.en.yml
  38. +1
    -0
      config/locales/simple_form.en.yml
  39. +5
    -1
      spec/controllers/api/v1/accounts/credentials_controller_spec.rb
  40. +1
    -1
      spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb
  41. +1
    -1
      spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb
  42. +1
    -1
      spec/controllers/api/v1/accounts/lists_controller_spec.rb
  43. +1
    -1
      spec/controllers/api/v1/accounts/relationships_controller_spec.rb
  44. +1
    -1
      spec/controllers/api/v1/accounts/search_controller_spec.rb
  45. +1
    -1
      spec/controllers/api/v1/accounts/statuses_controller_spec.rb
  46. +42
    -3
      spec/controllers/api/v1/accounts_controller_spec.rb
  47. +12
    -2
      spec/controllers/api/v1/blocks_controller_spec.rb
  48. +21
    -1
      spec/controllers/api/v1/domain_blocks_controller_spec.rb
  49. +1
    -1
      spec/controllers/api/v1/favourites_controller_spec.rb
  50. +7
    -1
      spec/controllers/api/v1/filter_controller_spec.rb
  51. +7
    -1
      spec/controllers/api/v1/follow_requests_controller_spec.rb
  52. +1
    -1
      spec/controllers/api/v1/follows_controller_spec.rb
  53. +6
    -1
      spec/controllers/api/v1/lists/accounts_controller_spec.rb
  54. +11
    -1
      spec/controllers/api/v1/lists_controller_spec.rb
  55. +1
    -1
      spec/controllers/api/v1/media_controller_spec.rb
  56. +1
    -1
      spec/controllers/api/v1/mutes_controller_spec.rb
  57. +9
    -1
      spec/controllers/api/v1/notifications_controller_spec.rb
  58. +4
    -1
      spec/controllers/api/v1/reports_controller_spec.rb
  59. +1
    -1
      spec/controllers/api/v1/search_controller_spec.rb
  60. +1
    -1
      spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb
  61. +1
    -1
      spec/controllers/api/v1/statuses/favourites_controller_spec.rb
  62. +1
    -1
      spec/controllers/api/v1/statuses/mutes_controller_spec.rb
  63. +1
    -1
      spec/controllers/api/v1/statuses/pins_controller_spec.rb
  64. +1
    -1
      spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb
  65. +1
    -1
      spec/controllers/api/v1/statuses/reblogs_controller_spec.rb
  66. +6
    -1
      spec/controllers/api/v1/statuses_controller_spec.rb
  67. +1
    -1
      spec/controllers/api/v1/timelines/home_controller_spec.rb
  68. +1
    -1
      spec/controllers/api/v1/timelines/list_controller_spec.rb
  69. +22
    -0
      spec/controllers/api/v2/search_controller_spec.rb

+ 4
- 0
app/controllers/api/base_controller.rb View File

@@ -78,4 +78,8 @@ class Api::BaseController < ApplicationController
def render_empty
render json: {}, status: 200
end

def authorize_if_got_token!(*scopes)
doorkeeper_authorize!(*scopes) if doorkeeper_token
end
end

+ 2
- 2
app/controllers/api/v1/accounts/credentials_controller.rb View File

@@ -1,8 +1,8 @@
# 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


+ 1
- 1
app/controllers/api/v1/accounts/follower_accounts_controller.rb View File

@@ -1,7 +1,7 @@
# 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



+ 1
- 1
app/controllers/api/v1/accounts/following_accounts_controller.rb View File

@@ -1,7 +1,7 @@
# 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



+ 1
- 1
app/controllers/api/v1/accounts/lists_controller.rb View File

@@ -1,7 +1,7 @@
# 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



+ 1
- 1
app/controllers/api/v1/accounts/relationships_controller.rb View File

@@ -1,7 +1,7 @@
# 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


+ 1
- 1
app/controllers/api/v1/accounts/search_controller.rb View File

@@ -1,7 +1,7 @@
# 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


+ 1
- 1
app/controllers/api/v1/accounts/statuses_controller.rb View File

@@ -1,7 +1,7 @@
# 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



+ 5
- 2
app/controllers/api/v1/accounts_controller.rb View File

@@ -1,8 +1,11 @@
# 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]


+ 1
- 1
app/controllers/api/v1/blocks_controller.rb View File

@@ -1,7 +1,7 @@
# 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



+ 2
- 1
app/controllers/api/v1/domain_blocks_controller.rb View File

@@ -3,7 +3,8 @@
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



+ 1
- 1
app/controllers/api/v1/favourites_controller.rb View File

@@ -1,7 +1,7 @@
# 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



+ 2
- 2
app/controllers/api/v1/filters_controller.rb View File

@@ -1,8 +1,8 @@
# 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]


+ 2
- 1
app/controllers/api/v1/follow_requests_controller.rb View File

@@ -1,7 +1,8 @@
# 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



+ 1
- 1
app/controllers/api/v1/follows_controller.rb View File

@@ -1,7 +1,7 @@
# 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


+ 2
- 2
app/controllers/api/v1/lists/accounts_controller.rb View File

@@ -1,8 +1,8 @@
# 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


+ 2
- 2
app/controllers/api/v1/lists_controller.rb View File

@@ -1,8 +1,8 @@
# 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]


+ 1
- 1
app/controllers/api/v1/media_controller.rb View File

@@ -1,7 +1,7 @@
# 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


+ 1
- 1
app/controllers/api/v1/mutes_controller.rb View File

@@ -1,7 +1,7 @@
# 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



+ 2
- 1
app/controllers/api/v1/notifications_controller.rb View File

@@ -1,7 +1,8 @@
# 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



+ 2
- 2
app/controllers/api/v1/reports_controller.rb View File

@@ -1,8 +1,8 @@
# 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


+ 1
- 1
app/controllers/api/v1/search_controller.rb View File

@@ -5,7 +5,7 @@ class Api::V1::SearchController < Api::BaseController

RESULTS_LIMIT = 5

before_action -> { doorkeeper_authorize! :read }
before_action -> { doorkeeper_authorize! :read, :'read:search' }
before_action :require_user!

respond_to :json


+ 1
- 6
app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb View File

@@ -3,7 +3,7 @@
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

@@ -71,11 +71,6 @@ class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController
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


+ 1
- 1
app/controllers/api/v1/statuses/favourites_controller.rb View File

@@ -3,7 +3,7 @@
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


+ 1
- 1
app/controllers/api/v1/statuses/mutes_controller.rb View File

@@ -3,7 +3,7 @@
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


+ 1
- 1
app/controllers/api/v1/statuses/pins_controller.rb View File

@@ -3,7 +3,7 @@
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



+ 1
- 6
app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb View File

@@ -3,7 +3,7 @@
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

@@ -68,11 +68,6 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController
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


+ 1
- 1
app/controllers/api/v1/statuses/reblogs_controller.rb View File

@@ -3,7 +3,7 @@
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


+ 2
- 7
app/controllers/api/v1/statuses_controller.rb View File

@@ -3,8 +3,8 @@
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]

@@ -84,9 +84,4 @@ class Api::V1::StatusesController < Api::BaseController
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

+ 1
- 1
app/controllers/api/v1/timelines/direct_controller.rb View File

@@ -1,7 +1,7 @@
# 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? }



+ 1
- 1
app/controllers/api/v1/timelines/home_controller.rb View File

@@ -1,7 +1,7 @@
# 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? }



+ 1
- 1
app/controllers/api/v1/timelines/list_controller.rb View File

@@ -1,7 +1,7 @@
# 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


+ 10
- 0
app/helpers/application_helper.rb View File

@@ -1,6 +1,12 @@
# frozen_string_literal: true

module ApplicationHelper
DANGEROUS_SCOPES = %w(
read
write
follow
).freeze

def active_nav_class(path)
current_page?(path) ? 'active' : ''
end
@@ -43,6 +49,10 @@ module ApplicationHelper
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}?")


+ 4
- 0
app/javascript/styles/mastodon/forms.scss View File

@@ -612,3 +612,7 @@ code {
display: block;
}
}

.scope-danger {
color: $warning-red;
}

+ 6
- 11
app/views/settings/applications/_fields.html.haml View File

@@ -8,14 +8,9 @@
%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'

+ 26
- 1
config/initializers/doorkeeper.rb View File

@@ -55,7 +55,32 @@ Doorkeeper.configure do
# 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


+ 26
- 4
config/locales/doorkeeper.en.yml View File

@@ -114,7 +114,29 @@ en:
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

+ 1
- 0
config/locales/simple_form.en.yml View File

@@ -20,6 +20,7 @@ en:
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


+ 5
- 1
spec/controllers/api/v1/accounts/credentials_controller_spec.rb View File

@@ -4,7 +4,7 @@ describe Api::V1::Accounts::CredentialsController 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 write') }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }

context 'with an oauth token' do
before do
@@ -12,6 +12,8 @@ describe Api::V1::Accounts::CredentialsController do
end

describe 'GET #show' do
let(:scopes) { 'read:accounts' }

it 'returns http success' do
get :show
expect(response).to have_http_status(200)
@@ -19,6 +21,8 @@ describe Api::V1::Accounts::CredentialsController do
end

describe 'PATCH #update' do
let(:scopes) { 'write:accounts' }

describe 'with valid data' do
before do
allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async)


+ 1
- 1
spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb View File

@@ -4,7 +4,7 @@ describe Api::V1::Accounts::FollowerAccountsController 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') }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') }

before do
Fabricate(:follow, target_account: user.account)


+ 1
- 1
spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb View File

@@ -4,7 +4,7 @@ describe Api::V1::Accounts::FollowingAccountsController 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') }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') }

before do
Fabricate(:follow, account: user.account)


+ 1
- 1
spec/controllers/api/v1/accounts/lists_controller_spec.rb View File

@@ -4,7 +4,7 @@ describe Api::V1::Accounts::ListsController 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') }
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) }



+ 1
- 1
spec/controllers/api/v1/accounts/relationships_controller_spec.rb View File

@@ -4,7 +4,7 @@ describe Api::V1::Accounts::RelationshipsController 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') }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:follows') }

before do
allow(controller).to receive(:doorkeeper_token) { token }


+ 1
- 1
spec/controllers/api/v1/accounts/search_controller_spec.rb View File

@@ -4,7 +4,7 @@ RSpec.describe Api::V1::Accounts::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') }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') }

before do
allow(controller).to receive(:doorkeeper_token) { token }


+ 1
- 1
spec/controllers/api/v1/accounts/statuses_controller_spec.rb View File

@@ -4,7 +4,7 @@ describe Api::V1::Accounts::StatusesController 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') }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses') }

before do
allow(controller).to receive(:doorkeeper_token) { token }


+ 42
- 3
spec/controllers/api/v1/accounts_controller_spec.rb View File

@@ -3,21 +3,38 @@ require 'rails_helper'
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
@@ -41,6 +58,8 @@ RSpec.describe Api::V1::AccountsController, type: :controller 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
@@ -60,10 +79,13 @@ RSpec.describe Api::V1::AccountsController, type: :controller 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
@@ -78,9 +100,12 @@ RSpec.describe Api::V1::AccountsController, type: :controller 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
@@ -99,9 +124,12 @@ RSpec.describe Api::V1::AccountsController, type: :controller 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
@@ -116,9 +144,12 @@ RSpec.describe Api::V1::AccountsController, type: :controller 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
@@ -141,9 +172,12 @@ RSpec.describe Api::V1::AccountsController, type: :controller 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
@@ -166,9 +200,12 @@ RSpec.describe Api::V1::AccountsController, type: :controller 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
@@ -183,5 +220,7 @@ RSpec.describe Api::V1::AccountsController, type: :controller 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

+ 12
- 2
spec/controllers/api/v1/blocks_controller_spec.rb View File

@@ -3,8 +3,9 @@ require 'rails_helper'
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 } }

@@ -49,5 +50,14 @@ RSpec.describe Api::V1::BlocksController, type: :controller do
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

+ 21
- 1
spec/controllers/api/v1/domain_blocks_controller_spec.rb View File

@@ -4,14 +4,24 @@ RSpec.describe Api::V1::DomainBlocksController, 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(: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
@@ -23,9 +33,13 @@ RSpec.describe Api::V1::DomainBlocksController, type: :controller do
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
@@ -37,9 +51,13 @@ RSpec.describe Api::V1::DomainBlocksController, type: :controller do
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
@@ -51,5 +69,7 @@ RSpec.describe Api::V1::DomainBlocksController, type: :controller do
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

+ 1
- 1
spec/controllers/api/v1/favourites_controller_spec.rb View File

@@ -45,7 +45,7 @@ RSpec.describe Api::V1::FavouritesController, type: :controller do
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



+ 7
- 1
spec/controllers/api/v1/filter_controller_spec.rb View File

@@ -4,13 +4,14 @@ RSpec.describe Api::V1::FiltersController, type: :controller do
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
@@ -20,6 +21,8 @@ RSpec.describe Api::V1::FiltersController, type: :controller do
end

describe 'POST #create' do
let(:scopes) { 'write:filters' }

before do
post :create, params: { phrase: 'magic', context: %w(home), irreversible: true }
end
@@ -39,6 +42,7 @@ RSpec.describe Api::V1::FiltersController, type: :controller do
end

describe 'GET #show' do
let(:scopes) { 'read:filters' }
let(:filter) { Fabricate(:custom_filter, account: user.account) }

it 'returns http success' do
@@ -48,6 +52,7 @@ RSpec.describe Api::V1::FiltersController, type: :controller do
end

describe 'PUT #update' do
let(:scopes) { 'write:filters' }
let(:filter) { Fabricate(:custom_filter, account: user.account) }

before do
@@ -64,6 +69,7 @@ RSpec.describe Api::V1::FiltersController, type: :controller do
end

describe 'DELETE #destroy' do
let(:scopes) { 'write:filters' }
let(:filter) { Fabricate(:custom_filter, account: user.account) }

before do


+ 7
- 1
spec/controllers/api/v1/follow_requests_controller_spec.rb View File

@@ -4,7 +4,7 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller 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
@@ -13,6 +13,8 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller do
end

describe 'GET #index' do
let(:scopes) { 'read:follows' }

before do
get :index, params: { limit: 1 }
end
@@ -23,6 +25,8 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller do
end

describe 'POST #authorize' do
let(:scopes) { 'write:follows' }

before do
post :authorize, params: { id: follower.id }
end
@@ -37,6 +41,8 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller do
end

describe 'POST #reject' do
let(:scopes) { 'write:follows' }

before do
post :reject, params: { id: follower.id }
end


+ 1
- 1
spec/controllers/api/v1/follows_controller_spec.rb View File

@@ -4,7 +4,7 @@ RSpec.describe Api::V1::FollowsController, 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(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:follows') }

before do
allow(controller).to receive(:doorkeeper_token) { token }


+ 6
- 1
spec/controllers/api/v1/lists/accounts_controller_spec.rb View File

@@ -4,7 +4,7 @@ describe Api::V1::Lists::AccountsController 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 write') }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:list) { Fabricate(:list, account: user.account) }

before do
@@ -14,6 +14,8 @@ describe Api::V1::Lists::AccountsController do
end

describe 'GET #index' do
let(:scopes) { 'read:lists' }

it 'returns http success' do
get :show, params: { list_id: list.id }

@@ -22,6 +24,7 @@ describe Api::V1::Lists::AccountsController do
end

describe 'POST #create' do
let(:scopes) { 'write:lists' }
let(:bob) { Fabricate(:account, username: 'bob') }

before do
@@ -39,6 +42,8 @@ describe Api::V1::Lists::AccountsController 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


+ 11
- 1
spec/controllers/api/v1/lists_controller_spec.rb View File

@@ -4,12 +4,14 @@ RSpec.describe Api::V1::ListsController, 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 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)
@@ -17,6 +19,8 @@ RSpec.describe Api::V1::ListsController, type: :controller do
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)
@@ -24,6 +28,8 @@ RSpec.describe Api::V1::ListsController, type: :controller do
end

describe 'POST #create' do
let(:scopes) { 'write:lists' }

before do
post :create, params: { title: 'Foo bar' }
end
@@ -39,6 +45,8 @@ RSpec.describe Api::V1::ListsController, type: :controller do
end

describe 'PUT #update' do
let(:scopes) { 'write:lists' }

before do
put :update, params: { id: list.id, title: 'Updated title' }
end
@@ -53,6 +61,8 @@ RSpec.describe Api::V1::ListsController, type: :controller do
end

describe 'DELETE #destroy' do
let(:scopes) { 'write:lists' }

before do
delete :destroy, params: { id: list.id }
end


+ 1
- 1
spec/controllers/api/v1/media_controller_spec.rb View File

@@ -4,7 +4,7 @@ RSpec.describe Api::V1::MediaController, 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: 'write') }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:media') }

before do
allow(controller).to receive(:doorkeeper_token) { token }


+ 1
- 1
spec/controllers/api/v1/mutes_controller_spec.rb View File

@@ -4,7 +4,7 @@ RSpec.describe Api::V1::MutesController, 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(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:mutes') }

before do
Fabricate(:mute, account: user.account, hide_notifications: false)


+ 9
- 1
spec/controllers/api/v1/notifications_controller_spec.rb View File

@@ -4,7 +4,7 @@ RSpec.describe Api::V1::NotificationsController, 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') }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:other) { Fabricate(:user, account: Fabricate(:account, username: 'bob')) }

before do
@@ -12,6 +12,8 @@ RSpec.describe Api::V1::NotificationsController, type: :controller 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 }
@@ -21,6 +23,8 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do
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 }
@@ -31,6 +35,8 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do
end

describe 'POST #clear' do
let(:scopes) { 'write:notifications' }

it 'clears notifications for the account' do
notification = Fabricate(:notification, account: user.account)
post :clear
@@ -41,6 +47,8 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do
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)


+ 4
- 1
spec/controllers/api/v1/reports_controller_spec.rb View File

@@ -6,13 +6,15 @@ RSpec.describe Api::V1::ReportsController, 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 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

@@ -21,6 +23,7 @@ RSpec.describe Api::V1::ReportsController, type: :controller do
end

describe 'POST #create' do
let(:scopes) { 'write:reports' }
let!(:status) { Fabricate(:status) }
let!(:admin) { Fabricate(:user, admin: true) }



+ 1
- 1
spec/controllers/api/v1/search_controller_spec.rb View File

@@ -6,7 +6,7 @@ RSpec.describe Api::V1::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') }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:search') }

before do
allow(controller).to receive(:doorkeeper_token) { token }


+ 1
- 1
spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb View File

@@ -5,7 +5,7 @@ RSpec.describe Api::V1::Statuses::FavouritedByAccountsController, type: :control

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


+ 1
- 1
spec/controllers/api/v1/statuses/favourites_controller_spec.rb View File

@@ -7,7 +7,7 @@ describe Api::V1::Statuses::FavouritesController 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


+ 1
- 1
spec/controllers/api/v1/statuses/mutes_controller_spec.rb View File

@@ -7,7 +7,7 @@ describe Api::V1::Statuses::MutesController 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


+ 1
- 1
spec/controllers/api/v1/statuses/pins_controller_spec.rb View File

@@ -7,7 +7,7 @@ describe Api::V1::Statuses::PinsController 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


+ 1
- 1
spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb View File

@@ -5,7 +5,7 @@ RSpec.describe Api::V1::Statuses::RebloggedByAccountsController, type: :controll

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


+ 1
- 1
spec/controllers/api/v1/statuses/reblogs_controller_spec.rb View File

@@ -7,7 +7,7 @@ describe Api::V1::Statuses::ReblogsController 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


+ 6
- 1
spec/controllers/api/v1/statuses_controller_spec.rb View File

@@ -5,7 +5,7 @@ RSpec.describe Api::V1::StatusesController, type: :controller 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
@@ -13,6 +13,7 @@ RSpec.describe Api::V1::StatusesController, type: :controller do
end

describe 'GET #show' do
let(:scopes) { 'read:statuses' }
let(:status) { Fabricate(:status, account: user.account) }

it 'returns http success' do
@@ -22,6 +23,7 @@ RSpec.describe Api::V1::StatusesController, type: :controller do
end

describe 'GET #context' do
let(:scopes) { 'read:statuses' }
let(:status) { Fabricate(:status, account: user.account) }

before do
@@ -35,6 +37,8 @@ RSpec.describe Api::V1::StatusesController, type: :controller do
end

describe 'POST #create' do
let(:scopes) { 'write:statuses' }

before do
post :create, params: { status: 'Hello world' }
end
@@ -45,6 +49,7 @@ RSpec.describe Api::V1::StatusesController, type: :controller do
end

describe 'DELETE #destroy' do
let(:scopes) { 'write:statuses' }
let(:status) { Fabricate(:status, account: user.account) }

before do


+ 1
- 1
spec/controllers/api/v1/timelines/home_controller_spec.rb View File

@@ -12,7 +12,7 @@ describe Api::V1::Timelines::HomeController 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


+ 1
- 1
spec/controllers/api/v1/timelines/list_controller_spec.rb View File

@@ -13,7 +13,7 @@ describe Api::V1::Timelines::ListController 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


+ 22
- 0
spec/controllers/api/v2/search_controller_spec.rb View File

@@ -0,0 +1,22 @@
# 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

Loading…
Cancel
Save