doorkeeper 4.4.3 → 5.5.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of doorkeeper might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/{NEWS.md → CHANGELOG.md} +393 -19
- data/README.md +97 -393
- data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
- data/app/controllers/doorkeeper/application_controller.rb +8 -5
- data/app/controllers/doorkeeper/application_metal_controller.rb +7 -11
- data/app/controllers/doorkeeper/applications_controller.rb +62 -27
- data/app/controllers/doorkeeper/authorizations_controller.rb +97 -17
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +22 -3
- data/app/controllers/doorkeeper/token_info_controller.rb +16 -4
- data/app/controllers/doorkeeper/tokens_controller.rb +98 -32
- data/app/helpers/doorkeeper/dashboard_helper.rb +9 -7
- data/app/views/doorkeeper/applications/_delete_form.html.erb +3 -1
- data/app/views/doorkeeper/applications/_form.html.erb +27 -26
- data/app/views/doorkeeper/applications/edit.html.erb +1 -1
- data/app/views/doorkeeper/applications/index.html.erb +17 -7
- data/app/views/doorkeeper/applications/new.html.erb +1 -1
- data/app/views/doorkeeper/applications/show.html.erb +38 -17
- data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
- data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
- data/app/views/doorkeeper/authorizations/new.html.erb +6 -0
- data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
- data/config/locales/en.yml +23 -3
- data/lib/doorkeeper/config/abstract_builder.rb +28 -0
- data/lib/doorkeeper/config/option.rb +82 -0
- data/lib/doorkeeper/config/validations.rb +53 -0
- data/lib/doorkeeper/config.rb +471 -140
- data/lib/doorkeeper/engine.rb +8 -2
- data/lib/doorkeeper/errors.rb +25 -16
- data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
- data/lib/doorkeeper/grant_flow/flow.rb +44 -0
- data/lib/doorkeeper/grant_flow/registry.rb +50 -0
- data/lib/doorkeeper/grant_flow.rb +45 -0
- data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
- data/lib/doorkeeper/grape/helpers.rb +13 -7
- data/lib/doorkeeper/helpers/controller.rb +43 -10
- data/lib/doorkeeper/models/access_grant_mixin.rb +97 -3
- data/lib/doorkeeper/models/access_token_mixin.rb +272 -66
- data/lib/doorkeeper/models/application_mixin.rb +50 -5
- data/lib/doorkeeper/models/concerns/accessible.rb +2 -0
- data/lib/doorkeeper/models/concerns/expirable.rb +7 -3
- data/lib/doorkeeper/models/concerns/orderable.rb +2 -0
- data/lib/doorkeeper/models/concerns/ownership.rb +4 -7
- data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
- data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
- data/lib/doorkeeper/models/concerns/revocable.rb +3 -27
- data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
- data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
- data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
- data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
- data/lib/doorkeeper/oauth/authorization/token.rb +58 -24
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +7 -5
- data/lib/doorkeeper/oauth/authorization_code_request.rb +58 -10
- data/lib/doorkeeper/oauth/base_request.rb +35 -24
- data/lib/doorkeeper/oauth/base_response.rb +2 -0
- data/lib/doorkeeper/oauth/client/credentials.rb +5 -5
- data/lib/doorkeeper/oauth/client.rb +10 -11
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +47 -4
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +16 -9
- data/lib/doorkeeper/oauth/client_credentials/validator.rb +56 -0
- data/lib/doorkeeper/oauth/client_credentials_request.rb +10 -11
- data/lib/doorkeeper/oauth/code_request.rb +8 -12
- data/lib/doorkeeper/oauth/code_response.rb +27 -15
- data/lib/doorkeeper/oauth/error.rb +3 -1
- data/lib/doorkeeper/oauth/error_response.rb +35 -14
- data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -18
- data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
- data/lib/doorkeeper/oauth/helpers/uri_checker.rb +42 -7
- data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
- data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
- data/lib/doorkeeper/oauth/invalid_token_response.rb +29 -4
- data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
- data/lib/doorkeeper/oauth/password_access_token_request.rb +43 -10
- data/lib/doorkeeper/oauth/pre_authorization.rb +133 -26
- data/lib/doorkeeper/oauth/refresh_token_request.rb +59 -31
- data/lib/doorkeeper/oauth/scopes.rb +8 -4
- data/lib/doorkeeper/oauth/token.rb +12 -8
- data/lib/doorkeeper/oauth/token_introspection.rb +97 -23
- data/lib/doorkeeper/oauth/token_request.rb +8 -20
- data/lib/doorkeeper/oauth/token_response.rb +14 -10
- data/lib/doorkeeper/oauth.rb +13 -0
- data/lib/doorkeeper/orm/active_record/access_grant.rb +5 -30
- data/lib/doorkeeper/orm/active_record/access_token.rb +5 -43
- data/lib/doorkeeper/orm/active_record/application.rb +6 -57
- data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
- data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
- data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
- data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
- data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
- data/lib/doorkeeper/orm/active_record.rb +27 -9
- data/lib/doorkeeper/rails/helpers.rb +10 -8
- data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
- data/lib/doorkeeper/rails/routes/mapper.rb +4 -2
- data/lib/doorkeeper/rails/routes/mapping.rb +9 -7
- data/lib/doorkeeper/rails/routes/registry.rb +45 -0
- data/lib/doorkeeper/rails/routes.rb +37 -30
- data/lib/doorkeeper/rake/db.rake +40 -0
- data/lib/doorkeeper/rake/setup.rake +11 -0
- data/lib/doorkeeper/rake.rb +14 -0
- data/lib/doorkeeper/request/authorization_code.rb +6 -4
- data/lib/doorkeeper/request/client_credentials.rb +3 -3
- data/lib/doorkeeper/request/code.rb +1 -1
- data/lib/doorkeeper/request/password.rb +4 -3
- data/lib/doorkeeper/request/refresh_token.rb +6 -5
- data/lib/doorkeeper/request/strategy.rb +4 -2
- data/lib/doorkeeper/request/token.rb +1 -1
- data/lib/doorkeeper/request.rb +61 -34
- data/lib/doorkeeper/secret_storing/base.rb +64 -0
- data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
- data/lib/doorkeeper/secret_storing/plain.rb +33 -0
- data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
- data/lib/doorkeeper/server.rb +9 -11
- data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
- data/lib/doorkeeper/validations.rb +2 -0
- data/lib/doorkeeper/version.rb +7 -29
- data/lib/doorkeeper.rb +111 -64
- data/lib/generators/doorkeeper/application_owner_generator.rb +24 -18
- data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
- data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
- data/lib/generators/doorkeeper/install_generator.rb +19 -9
- data/lib/generators/doorkeeper/migration_generator.rb +23 -18
- data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
- data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +28 -22
- data/{spec/dummy/db/migrate/20180210183654_add_confidential_to_application.rb → lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb} +2 -2
- data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +3 -1
- data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
- data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
- data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
- data/lib/generators/doorkeeper/templates/initializer.rb +382 -30
- data/lib/generators/doorkeeper/templates/migration.rb.erb +35 -16
- data/lib/generators/doorkeeper/views_generator.rb +8 -4
- data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
- metadata +95 -309
- data/.coveralls.yml +0 -1
- data/.github/ISSUE_TEMPLATE.md +0 -25
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
- data/.gitignore +0 -19
- data/.hound.yml +0 -2
- data/.rspec +0 -1
- data/.rubocop.yml +0 -17
- data/.travis.yml +0 -38
- data/Appraisals +0 -18
- data/CODE_OF_CONDUCT.md +0 -46
- data/CONTRIBUTING.md +0 -47
- data/Gemfile +0 -10
- data/RELEASING.md +0 -10
- data/Rakefile +0 -20
- data/SECURITY.md +0 -15
- data/app/validators/redirect_uri_validator.rb +0 -44
- data/doorkeeper.gemspec +0 -32
- data/gemfiles/rails_4_2.gemfile +0 -13
- data/gemfiles/rails_5_0.gemfile +0 -12
- data/gemfiles/rails_5_1.gemfile +0 -12
- data/gemfiles/rails_5_2.gemfile +0 -12
- data/gemfiles/rails_master.gemfile +0 -14
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
- data/lib/generators/doorkeeper/add_client_confidentiality_generator.rb +0 -31
- data/lib/generators/doorkeeper/templates/add_confidential_to_application_migration.rb.erb +0 -11
- data/spec/controllers/application_metal_controller.rb +0 -10
- data/spec/controllers/applications_controller_spec.rb +0 -69
- data/spec/controllers/authorizations_controller_spec.rb +0 -250
- data/spec/controllers/protected_resources_controller_spec.rb +0 -309
- data/spec/controllers/token_info_controller_spec.rb +0 -56
- data/spec/controllers/tokens_controller_spec.rb +0 -274
- data/spec/dummy/Rakefile +0 -7
- data/spec/dummy/app/controllers/application_controller.rb +0 -3
- data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
- data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
- data/spec/dummy/app/controllers/home_controller.rb +0 -17
- data/spec/dummy/app/controllers/metal_controller.rb +0 -11
- data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
- data/spec/dummy/app/helpers/application_helper.rb +0 -5
- data/spec/dummy/app/models/user.rb +0 -5
- data/spec/dummy/app/views/home/index.html.erb +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +0 -14
- data/spec/dummy/config/application.rb +0 -23
- data/spec/dummy/config/boot.rb +0 -9
- data/spec/dummy/config/database.yml +0 -15
- data/spec/dummy/config/environment.rb +0 -5
- data/spec/dummy/config/environments/development.rb +0 -29
- data/spec/dummy/config/environments/production.rb +0 -62
- data/spec/dummy/config/environments/test.rb +0 -44
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy/config/initializers/doorkeeper.rb +0 -112
- data/spec/dummy/config/initializers/new_framework_defaults.rb +0 -6
- data/spec/dummy/config/initializers/secret_token.rb +0 -8
- data/spec/dummy/config/initializers/session_store.rb +0 -8
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
- data/spec/dummy/config/routes.rb +0 -52
- data/spec/dummy/config.ru +0 -4
- data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
- data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
- data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -62
- data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
- data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
- data/spec/dummy/db/schema.rb +0 -68
- data/spec/dummy/public/404.html +0 -26
- data/spec/dummy/public/422.html +0 -26
- data/spec/dummy/public/500.html +0 -26
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +0 -6
- data/spec/factories.rb +0 -28
- data/spec/generators/application_owner_generator_spec.rb +0 -41
- data/spec/generators/install_generator_spec.rb +0 -31
- data/spec/generators/migration_generator_spec.rb +0 -41
- data/spec/generators/previous_refresh_token_generator_spec.rb +0 -57
- data/spec/generators/templates/routes.rb +0 -3
- data/spec/generators/views_generator_spec.rb +0 -27
- data/spec/grape/grape_integration_spec.rb +0 -135
- data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
- data/spec/lib/config_spec.rb +0 -462
- data/spec/lib/doorkeeper_spec.rb +0 -150
- data/spec/lib/models/expirable_spec.rb +0 -50
- data/spec/lib/models/revocable_spec.rb +0 -59
- data/spec/lib/models/scopes_spec.rb +0 -43
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -41
- data/spec/lib/oauth/authorization_code_request_spec.rb +0 -123
- data/spec/lib/oauth/base_request_spec.rb +0 -155
- data/spec/lib/oauth/base_response_spec.rb +0 -45
- data/spec/lib/oauth/client/credentials_spec.rb +0 -90
- data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
- data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
- data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
- data/spec/lib/oauth/client_credentials_request_spec.rb +0 -105
- data/spec/lib/oauth/client_spec.rb +0 -39
- data/spec/lib/oauth/code_request_spec.rb +0 -43
- data/spec/lib/oauth/code_response_spec.rb +0 -34
- data/spec/lib/oauth/error_response_spec.rb +0 -61
- data/spec/lib/oauth/error_spec.rb +0 -23
- data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
- data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
- data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -218
- data/spec/lib/oauth/invalid_token_response_spec.rb +0 -56
- data/spec/lib/oauth/password_access_token_request_spec.rb +0 -96
- data/spec/lib/oauth/pre_authorization_spec.rb +0 -160
- data/spec/lib/oauth/refresh_token_request_spec.rb +0 -166
- data/spec/lib/oauth/scopes_spec.rb +0 -149
- data/spec/lib/oauth/token_request_spec.rb +0 -96
- data/spec/lib/oauth/token_response_spec.rb +0 -85
- data/spec/lib/oauth/token_spec.rb +0 -116
- data/spec/lib/request/strategy_spec.rb +0 -53
- data/spec/lib/server_spec.rb +0 -59
- data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
- data/spec/models/doorkeeper/access_token_spec.rb +0 -418
- data/spec/models/doorkeeper/application_spec.rb +0 -303
- data/spec/requests/applications/applications_request_spec.rb +0 -94
- data/spec/requests/applications/authorized_applications_spec.rb +0 -30
- data/spec/requests/endpoints/authorization_spec.rb +0 -71
- data/spec/requests/endpoints/token_spec.rb +0 -71
- data/spec/requests/flows/authorization_code_errors_spec.rb +0 -76
- data/spec/requests/flows/authorization_code_spec.rb +0 -149
- data/spec/requests/flows/client_credentials_spec.rb +0 -86
- data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
- data/spec/requests/flows/implicit_grant_spec.rb +0 -61
- data/spec/requests/flows/password_spec.rb +0 -197
- data/spec/requests/flows/refresh_token_spec.rb +0 -174
- data/spec/requests/flows/revoke_token_spec.rb +0 -157
- data/spec/requests/flows/skip_authorization_spec.rb +0 -59
- data/spec/requests/protected_resources/metal_spec.rb +0 -14
- data/spec/requests/protected_resources/private_api_spec.rb +0 -81
- data/spec/routing/custom_controller_routes_spec.rb +0 -75
- data/spec/routing/default_routes_spec.rb +0 -39
- data/spec/routing/scoped_routes_spec.rb +0 -31
- data/spec/spec_helper.rb +0 -4
- data/spec/spec_helper_integration.rb +0 -74
- data/spec/support/dependencies/factory_girl.rb +0 -2
- data/spec/support/helpers/access_token_request_helper.rb +0 -11
- data/spec/support/helpers/authorization_request_helper.rb +0 -41
- data/spec/support/helpers/config_helper.rb +0 -9
- data/spec/support/helpers/model_helper.rb +0 -72
- data/spec/support/helpers/request_spec_helper.rb +0 -88
- data/spec/support/helpers/url_helper.rb +0 -56
- data/spec/support/http_method_shim.rb +0 -38
- data/spec/support/orm/active_record.rb +0 -3
- data/spec/support/shared/controllers_shared_context.rb +0 -65
- data/spec/support/shared/models_shared_examples.rb +0 -52
- data/spec/validators/redirect_uri_validator_spec.rb +0 -123
- data/spec/version/version_spec.rb +0 -15
@@ -1,14 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "rails", git: 'https://github.com/rails/rails'
|
6
|
-
gem "arel", git: 'https://github.com/rails/arel'
|
7
|
-
|
8
|
-
gem "appraisal"
|
9
|
-
gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
|
10
|
-
gem "sqlite3", platform: [:ruby, :mswin, :mingw, :x64_mingw]
|
11
|
-
gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
|
12
|
-
gem "rspec-rails", "~> 3.7"
|
13
|
-
|
14
|
-
gemspec path: "../"
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'doorkeeper/validations'
|
2
|
-
require 'doorkeeper/oauth/scopes'
|
3
|
-
require 'doorkeeper/oauth/helpers/scope_checker'
|
4
|
-
|
5
|
-
module Doorkeeper
|
6
|
-
module OAuth
|
7
|
-
class ClientCredentialsRequest < BaseRequest
|
8
|
-
class Validation
|
9
|
-
include Validations
|
10
|
-
include OAuth::Helpers
|
11
|
-
|
12
|
-
validate :client, error: :invalid_client
|
13
|
-
validate :scopes, error: :invalid_scope
|
14
|
-
|
15
|
-
def initialize(server, request)
|
16
|
-
@server, @request, @client = server, request, request.client
|
17
|
-
|
18
|
-
validate
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def validate_client
|
24
|
-
@client.present?
|
25
|
-
end
|
26
|
-
|
27
|
-
def validate_scopes
|
28
|
-
return true unless @request.scopes.present?
|
29
|
-
|
30
|
-
application_scopes = if @client.present?
|
31
|
-
@client.application.scopes
|
32
|
-
else
|
33
|
-
''
|
34
|
-
end
|
35
|
-
|
36
|
-
ScopeChecker.valid?(
|
37
|
-
@request.scopes.to_s,
|
38
|
-
@server.scopes,
|
39
|
-
application_scopes
|
40
|
-
)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rails/generators/active_record'
|
4
|
-
|
5
|
-
module Doorkeeper
|
6
|
-
class AddClientConfidentialityGenerator < ::Rails::Generators::Base
|
7
|
-
include ::Rails::Generators::Migration
|
8
|
-
source_root File.expand_path('templates', __dir__)
|
9
|
-
desc 'Adds a migration to fix CVE-2018-1000211.'
|
10
|
-
|
11
|
-
def install
|
12
|
-
migration_template(
|
13
|
-
'add_confidential_to_application_migration.rb.erb',
|
14
|
-
'db/migrate/add_confidential_to_doorkeeper_application.rb',
|
15
|
-
migration_version: migration_version
|
16
|
-
)
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.next_migration_number(dirname)
|
20
|
-
::ActiveRecord::Generators::Base.next_migration_number(dirname)
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def migration_version
|
26
|
-
if ::ActiveRecord::VERSION::MAJOR >= 5
|
27
|
-
"[#{::ActiveRecord::VERSION::MAJOR}.#{::ActiveRecord::VERSION::MINOR}]"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
class AddConfidentialToDoorkeeperApplication < ActiveRecord::Migration<%= migration_version %>
|
2
|
-
def change
|
3
|
-
add_column(
|
4
|
-
:oauth_applications,
|
5
|
-
:confidential,
|
6
|
-
:boolean,
|
7
|
-
null: false,
|
8
|
-
default: true # maintaining backwards compatibility: require secrets
|
9
|
-
)
|
10
|
-
end
|
11
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
module Doorkeeper
|
4
|
-
describe ApplicationsController do
|
5
|
-
context 'when admin is not authenticated' do
|
6
|
-
before do
|
7
|
-
allow(Doorkeeper.configuration).to receive(:authenticate_admin).and_return(proc do
|
8
|
-
redirect_to main_app.root_url
|
9
|
-
end)
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'redirects as set in Doorkeeper.authenticate_admin' do
|
13
|
-
get :index
|
14
|
-
expect(response).to redirect_to(controller.main_app.root_url)
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'does not create application' do
|
18
|
-
expect do
|
19
|
-
post :create, doorkeeper_application: {
|
20
|
-
name: 'Example',
|
21
|
-
redirect_uri: 'https://example.com' }
|
22
|
-
end.not_to change { Doorkeeper::Application.count }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'when admin is authenticated' do
|
27
|
-
render_views
|
28
|
-
|
29
|
-
before do
|
30
|
-
allow(Doorkeeper.configuration).to receive(:authenticate_admin).and_return(->(*) { true })
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'sorts applications by created_at' do
|
34
|
-
first_application = FactoryBot.create(:application)
|
35
|
-
second_application = FactoryBot.create(:application)
|
36
|
-
expect(Doorkeeper::Application).to receive(:ordered_by).and_call_original
|
37
|
-
get :index
|
38
|
-
expect(response.body).to have_selector("tbody tr:first-child#application_#{first_application.id}")
|
39
|
-
expect(response.body).to have_selector("tbody tr:last-child#application_#{second_application.id}")
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'creates application' do
|
43
|
-
expect do
|
44
|
-
post :create, doorkeeper_application: {
|
45
|
-
name: 'Example',
|
46
|
-
redirect_uri: 'https://example.com' }
|
47
|
-
end.to change { Doorkeeper::Application.count }.by(1)
|
48
|
-
expect(response).to be_redirect
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'does not allow mass assignment of uid or secret' do
|
52
|
-
application = FactoryBot.create(:application)
|
53
|
-
put :update, id: application.id, doorkeeper_application: {
|
54
|
-
uid: '1A2B3C4D',
|
55
|
-
secret: '1A2B3C4D' }
|
56
|
-
|
57
|
-
expect(application.reload.uid).not_to eq '1A2B3C4D'
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'updates application' do
|
61
|
-
application = FactoryBot.create(:application)
|
62
|
-
put :update, id: application.id, doorkeeper_application: {
|
63
|
-
name: 'Example',
|
64
|
-
redirect_uri: 'https://example.com' }
|
65
|
-
expect(application.reload.name).to eq 'Example'
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
@@ -1,250 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
describe Doorkeeper::AuthorizationsController, 'implicit grant flow' do
|
4
|
-
include AuthorizationRequestHelper
|
5
|
-
|
6
|
-
if Rails::VERSION::MAJOR >= 5
|
7
|
-
class ActionDispatch::TestResponse
|
8
|
-
def query_params
|
9
|
-
@_query_params ||= begin
|
10
|
-
fragment = URI.parse(location).fragment
|
11
|
-
Rack::Utils.parse_query(fragment)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
else
|
16
|
-
class ActionController::TestResponse
|
17
|
-
def query_params
|
18
|
-
@_query_params ||= begin
|
19
|
-
fragment = URI.parse(location).fragment
|
20
|
-
Rack::Utils.parse_query(fragment)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def translated_error_message(key)
|
27
|
-
I18n.translate key, scope: %i[doorkeeper errors messages]
|
28
|
-
end
|
29
|
-
|
30
|
-
let(:client) { FactoryBot.create :application }
|
31
|
-
let(:user) { User.create!(name: 'Joe', password: 'sekret') }
|
32
|
-
let(:access_token) { FactoryBot.build :access_token, resource_owner_id: user.id, application_id: client.id }
|
33
|
-
|
34
|
-
before do
|
35
|
-
allow(Doorkeeper.configuration).to receive(:grant_flows).and_return(["implicit"])
|
36
|
-
allow(controller).to receive(:current_resource_owner).and_return(user)
|
37
|
-
end
|
38
|
-
|
39
|
-
describe 'POST #create' do
|
40
|
-
before do
|
41
|
-
post :create, client_id: client.uid, response_type: 'token', redirect_uri: client.redirect_uri
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'redirects after authorization' do
|
45
|
-
expect(response).to be_redirect
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'redirects to client redirect uri' do
|
49
|
-
expect(response.location).to match(%r{^#{client.redirect_uri}})
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'includes access token in fragment' do
|
53
|
-
expect(response.query_params['access_token']).to eq(Doorkeeper::AccessToken.first.token)
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'includes token type in fragment' do
|
57
|
-
expect(response.query_params['token_type']).to eq('Bearer')
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'includes token expiration in fragment' do
|
61
|
-
expect(response.query_params['expires_in'].to_i).to eq(2.hours.to_i)
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'issues the token for the current client' do
|
65
|
-
expect(Doorkeeper::AccessToken.first.application_id).to eq(client.id)
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'issues the token for the current resource owner' do
|
69
|
-
expect(Doorkeeper::AccessToken.first.resource_owner_id).to eq(user.id)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe 'POST #create with errors' do
|
74
|
-
before do
|
75
|
-
default_scopes_exist :public
|
76
|
-
post :create, client_id: client.uid, response_type: 'token', scope: 'invalid', redirect_uri: client.redirect_uri
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'redirects after authorization' do
|
80
|
-
expect(response).to be_redirect
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'redirects to client redirect uri' do
|
84
|
-
expect(response.location).to match(%r{^#{client.redirect_uri}})
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'does not include access token in fragment' do
|
88
|
-
expect(response.query_params['access_token']).to be_nil
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'includes error in fragment' do
|
92
|
-
expect(response.query_params['error']).to eq('invalid_scope')
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'includes error description in fragment' do
|
96
|
-
expect(response.query_params['error_description']).to eq(translated_error_message(:invalid_scope))
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'does not issue any access token' do
|
100
|
-
expect(Doorkeeper::AccessToken.all).to be_empty
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe 'POST #create with application already authorized' do
|
105
|
-
before do
|
106
|
-
allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
|
107
|
-
|
108
|
-
access_token.save!
|
109
|
-
post :create, client_id: client.uid, response_type: 'token', redirect_uri: client.redirect_uri
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'returns the existing access token in a fragment' do
|
113
|
-
expect(response.query_params['access_token']).to eq(access_token.token)
|
114
|
-
end
|
115
|
-
|
116
|
-
it 'does not creates a new access token' do
|
117
|
-
expect(Doorkeeper::AccessToken.count).to eq(1)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
describe 'GET #new token request with native url and skip_authorization true' do
|
122
|
-
before do
|
123
|
-
allow(Doorkeeper.configuration).to receive(:skip_authorization).and_return(proc do
|
124
|
-
true
|
125
|
-
end)
|
126
|
-
client.update_attribute :redirect_uri, 'urn:ietf:wg:oauth:2.0:oob'
|
127
|
-
get :new, client_id: client.uid, response_type: 'token', redirect_uri: client.redirect_uri
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'should redirect immediately' do
|
131
|
-
expect(response).to be_redirect
|
132
|
-
expect(response.location).to match(/oauth\/token\/info\?access_token=/)
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'should not issue a grant' do
|
136
|
-
expect(Doorkeeper::AccessGrant.count).to be 0
|
137
|
-
end
|
138
|
-
|
139
|
-
it 'should issue a token' do
|
140
|
-
expect(Doorkeeper::AccessToken.count).to be 1
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
describe 'GET #new code request with native url and skip_authorization true' do
|
145
|
-
before do
|
146
|
-
allow(Doorkeeper.configuration).to receive(:grant_flows).
|
147
|
-
and_return(%w[authorization_code])
|
148
|
-
allow(Doorkeeper.configuration).to receive(:skip_authorization).and_return(proc do
|
149
|
-
true
|
150
|
-
end)
|
151
|
-
client.update_attribute :redirect_uri, 'urn:ietf:wg:oauth:2.0:oob'
|
152
|
-
get :new, client_id: client.uid, response_type: 'code', redirect_uri: client.redirect_uri
|
153
|
-
end
|
154
|
-
|
155
|
-
it 'should redirect immediately' do
|
156
|
-
expect(response).to be_redirect
|
157
|
-
expect(response.location).to match(/oauth\/authorize\/native\?code=#{Doorkeeper::AccessGrant.first.token}/)
|
158
|
-
end
|
159
|
-
|
160
|
-
it 'should issue a grant' do
|
161
|
-
expect(Doorkeeper::AccessGrant.count).to be 1
|
162
|
-
end
|
163
|
-
|
164
|
-
it 'should not issue a token' do
|
165
|
-
expect(Doorkeeper::AccessToken.count).to be 0
|
166
|
-
end
|
167
|
-
|
168
|
-
context 'with opt_out_native_route_change' do
|
169
|
-
around(:each) do |example|
|
170
|
-
Doorkeeper.configure do
|
171
|
-
orm DOORKEEPER_ORM
|
172
|
-
opt_out_native_route_change
|
173
|
-
end
|
174
|
-
|
175
|
-
Rails.application.reload_routes!
|
176
|
-
|
177
|
-
example.run
|
178
|
-
|
179
|
-
Doorkeeper.configure do
|
180
|
-
orm DOORKEEPER_ORM
|
181
|
-
end
|
182
|
-
|
183
|
-
Rails.application.reload_routes!
|
184
|
-
end
|
185
|
-
|
186
|
-
it 'should redirect immediately' do
|
187
|
-
expect(response).to be_redirect
|
188
|
-
expect(response.location).to match(/oauth\/authorize\/#{Doorkeeper::AccessGrant.first.token}/)
|
189
|
-
end
|
190
|
-
|
191
|
-
it 'should issue a grant' do
|
192
|
-
expect(Doorkeeper::AccessGrant.count).to be 1
|
193
|
-
end
|
194
|
-
|
195
|
-
it 'should not issue a token' do
|
196
|
-
expect(Doorkeeper::AccessToken.count).to be 0
|
197
|
-
end
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
describe 'GET #new with skip_authorization true' do
|
202
|
-
before do
|
203
|
-
allow(Doorkeeper.configuration).to receive(:skip_authorization).and_return(proc do
|
204
|
-
true
|
205
|
-
end)
|
206
|
-
get :new, client_id: client.uid, response_type: 'token', redirect_uri: client.redirect_uri
|
207
|
-
end
|
208
|
-
|
209
|
-
it 'should redirect immediately' do
|
210
|
-
expect(response).to be_redirect
|
211
|
-
expect(response.location).to match(%r{^#{client.redirect_uri}})
|
212
|
-
end
|
213
|
-
|
214
|
-
it 'should issue a token' do
|
215
|
-
expect(Doorkeeper::AccessToken.count).to be 1
|
216
|
-
end
|
217
|
-
|
218
|
-
it 'includes token type in fragment' do
|
219
|
-
expect(response.query_params['token_type']).to eq('Bearer')
|
220
|
-
end
|
221
|
-
|
222
|
-
it 'includes token expiration in fragment' do
|
223
|
-
expect(response.query_params['expires_in'].to_i).to eq(2.hours.to_i)
|
224
|
-
end
|
225
|
-
|
226
|
-
it 'issues the token for the current client' do
|
227
|
-
expect(Doorkeeper::AccessToken.first.application_id).to eq(client.id)
|
228
|
-
end
|
229
|
-
|
230
|
-
it 'issues the token for the current resource owner' do
|
231
|
-
expect(Doorkeeper::AccessToken.first.resource_owner_id).to eq(user.id)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
describe 'GET #new with errors' do
|
236
|
-
before do
|
237
|
-
default_scopes_exist :public
|
238
|
-
get :new, an_invalid: 'request'
|
239
|
-
end
|
240
|
-
|
241
|
-
it 'does not redirect' do
|
242
|
-
expect(response).to_not be_redirect
|
243
|
-
end
|
244
|
-
|
245
|
-
it 'does not issue any token' do
|
246
|
-
expect(Doorkeeper::AccessGrant.count).to eq 0
|
247
|
-
expect(Doorkeeper::AccessToken.count).to eq 0
|
248
|
-
end
|
249
|
-
end
|
250
|
-
end
|
@@ -1,309 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
module ControllerActions
|
4
|
-
def index
|
5
|
-
render plain: 'index'
|
6
|
-
end
|
7
|
-
|
8
|
-
def show
|
9
|
-
render plain: 'show'
|
10
|
-
end
|
11
|
-
|
12
|
-
def doorkeeper_unauthorized_render_options(*); end
|
13
|
-
|
14
|
-
def doorkeeper_forbidden_render_options(*); end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe 'doorkeeper authorize filter' do
|
18
|
-
context 'accepts token code specified as' do
|
19
|
-
controller do
|
20
|
-
before_action :doorkeeper_authorize!
|
21
|
-
|
22
|
-
def index
|
23
|
-
render plain: 'index'
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
let(:token_string) { '1A2BC3' }
|
28
|
-
let(:token) do
|
29
|
-
double(Doorkeeper::AccessToken,
|
30
|
-
acceptable?: true, previous_refresh_token: "",
|
31
|
-
revoke_previous_refresh_token!: true)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'access_token param' do
|
35
|
-
expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
|
36
|
-
get :index, access_token: token_string
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'bearer_token param' do
|
40
|
-
expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
|
41
|
-
get :index, bearer_token: token_string
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'Authorization header' do
|
45
|
-
expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
|
46
|
-
request.env['HTTP_AUTHORIZATION'] = "Bearer #{token_string}"
|
47
|
-
get :index
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'different kind of Authorization header' do
|
51
|
-
expect(Doorkeeper::AccessToken).not_to receive(:by_token)
|
52
|
-
request.env['HTTP_AUTHORIZATION'] = "MAC #{token_string}"
|
53
|
-
get :index
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'does not change Authorization header value' do
|
57
|
-
expect(Doorkeeper::AccessToken).to receive(:by_token).exactly(2).times.and_return(token)
|
58
|
-
request.env['HTTP_AUTHORIZATION'] = "Bearer #{token_string}"
|
59
|
-
get :index
|
60
|
-
controller.send(:remove_instance_variable, :@_doorkeeper_token)
|
61
|
-
get :index
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context 'defined for all actions' do
|
66
|
-
controller do
|
67
|
-
before_action :doorkeeper_authorize!
|
68
|
-
|
69
|
-
include ControllerActions
|
70
|
-
end
|
71
|
-
|
72
|
-
context 'with valid token', token: :valid do
|
73
|
-
it 'allows into index action' do
|
74
|
-
get :index, access_token: token_string
|
75
|
-
expect(response).to be_successful
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'allows into show action' do
|
79
|
-
get :show, id: '4', access_token: token_string
|
80
|
-
expect(response).to be_successful
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
context 'with invalid token', token: :invalid do
|
85
|
-
it 'does not allow into index action' do
|
86
|
-
get :index, access_token: token_string
|
87
|
-
expect(response.status).to eq 401
|
88
|
-
expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'does not allow into show action' do
|
92
|
-
get :show, id: '4', access_token: token_string
|
93
|
-
expect(response.status).to eq 401
|
94
|
-
expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
context 'defined with scopes' do
|
100
|
-
controller do
|
101
|
-
before_action -> { doorkeeper_authorize! :write }
|
102
|
-
|
103
|
-
include ControllerActions
|
104
|
-
end
|
105
|
-
|
106
|
-
let(:token_string) { '1A2DUWE' }
|
107
|
-
|
108
|
-
it 'allows if the token has particular scopes' do
|
109
|
-
token = double(Doorkeeper::AccessToken,
|
110
|
-
accessible?: true, scopes: %w[write public],
|
111
|
-
previous_refresh_token: "",
|
112
|
-
revoke_previous_refresh_token!: true)
|
113
|
-
expect(token).to receive(:acceptable?).with([:write]).and_return(true)
|
114
|
-
expect(
|
115
|
-
Doorkeeper::AccessToken
|
116
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
117
|
-
|
118
|
-
get :index, access_token: token_string
|
119
|
-
expect(response).to be_successful
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'does not allow if the token does not include given scope' do
|
123
|
-
token = double(Doorkeeper::AccessToken,
|
124
|
-
accessible?: true, scopes: ['public'], revoked?: false,
|
125
|
-
expired?: false, previous_refresh_token: "",
|
126
|
-
revoke_previous_refresh_token!: true)
|
127
|
-
expect(
|
128
|
-
Doorkeeper::AccessToken
|
129
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
130
|
-
expect(token).to receive(:acceptable?).with([:write]).and_return(false)
|
131
|
-
|
132
|
-
get :index, access_token: token_string
|
133
|
-
expect(response.status).to eq 403
|
134
|
-
expect(response.header).to_not include('WWW-Authenticate')
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
context 'when custom unauthorized render options are configured' do
|
139
|
-
controller do
|
140
|
-
before_action :doorkeeper_authorize!
|
141
|
-
|
142
|
-
include ControllerActions
|
143
|
-
end
|
144
|
-
|
145
|
-
context 'with a JSON custom render', token: :invalid do
|
146
|
-
before do
|
147
|
-
module ControllerActions
|
148
|
-
remove_method :doorkeeper_unauthorized_render_options
|
149
|
-
|
150
|
-
def doorkeeper_unauthorized_render_options(error: nil)
|
151
|
-
{ json: ActiveSupport::JSON.encode(error_message: error.description) }
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
after do
|
157
|
-
module ControllerActions
|
158
|
-
remove_method :doorkeeper_unauthorized_render_options
|
159
|
-
|
160
|
-
def doorkeeper_unauthorized_render_options(error: nil)
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
it 'it renders a custom JSON response', token: :invalid do
|
166
|
-
get :index, access_token: token_string
|
167
|
-
expect(response.status).to eq 401
|
168
|
-
expect(response.content_type).to eq('application/json')
|
169
|
-
expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
|
170
|
-
|
171
|
-
expect(json_response).not_to be_nil
|
172
|
-
expect(json_response['error_message']).to match('token is invalid')
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
context 'with a text custom render', token: :invalid do
|
177
|
-
before do
|
178
|
-
module ControllerActions
|
179
|
-
remove_method :doorkeeper_unauthorized_render_options
|
180
|
-
|
181
|
-
def doorkeeper_unauthorized_render_options(**)
|
182
|
-
{ plain: 'Unauthorized' }
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
after do
|
188
|
-
module ControllerActions
|
189
|
-
remove_method :doorkeeper_unauthorized_render_options
|
190
|
-
|
191
|
-
def doorkeeper_unauthorized_render_options(error: nil); end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
it 'it renders a custom text response', token: :invalid do
|
196
|
-
get :index, access_token: token_string
|
197
|
-
expect(response.status).to eq 401
|
198
|
-
expect(response.content_type).to eq('text/plain')
|
199
|
-
expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
|
200
|
-
expect(response.body).to eq('Unauthorized')
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
context 'when custom forbidden render options are configured' do
|
206
|
-
before do
|
207
|
-
expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
|
208
|
-
expect(token).to receive(:acceptable?).with([:write]).and_return(false)
|
209
|
-
end
|
210
|
-
|
211
|
-
after do
|
212
|
-
module ControllerActions
|
213
|
-
remove_method :doorkeeper_forbidden_render_options
|
214
|
-
|
215
|
-
def doorkeeper_forbidden_render_options(*); end
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
controller do
|
220
|
-
before_action -> { doorkeeper_authorize! :write }
|
221
|
-
|
222
|
-
include ControllerActions
|
223
|
-
end
|
224
|
-
|
225
|
-
let(:token) do
|
226
|
-
double(Doorkeeper::AccessToken,
|
227
|
-
accessible?: true, scopes: ['public'], revoked?: false,
|
228
|
-
expired?: false, previous_refresh_token: "",
|
229
|
-
revoke_previous_refresh_token!: true)
|
230
|
-
end
|
231
|
-
|
232
|
-
let(:token_string) { '1A2DUWE' }
|
233
|
-
|
234
|
-
context 'with a JSON custom render' do
|
235
|
-
before do
|
236
|
-
module ControllerActions
|
237
|
-
remove_method :doorkeeper_forbidden_render_options
|
238
|
-
|
239
|
-
def doorkeeper_forbidden_render_options(*)
|
240
|
-
{ json: { error_message: 'Forbidden' } }
|
241
|
-
end
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
it 'renders a custom JSON response' do
|
246
|
-
get :index, access_token: token_string
|
247
|
-
expect(response.header).to_not include('WWW-Authenticate')
|
248
|
-
expect(response.content_type).to eq('application/json')
|
249
|
-
expect(response.status).to eq 403
|
250
|
-
|
251
|
-
expect(json_response).not_to be_nil
|
252
|
-
expect(json_response['error_message']).to match('Forbidden')
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
context 'with a status and JSON custom render' do
|
257
|
-
before do
|
258
|
-
module ControllerActions
|
259
|
-
remove_method :doorkeeper_forbidden_render_options
|
260
|
-
def doorkeeper_forbidden_render_options(*)
|
261
|
-
{ json: { error_message: 'Not Found' },
|
262
|
-
respond_not_found_when_forbidden: true }
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
it 'overrides the default status code' do
|
268
|
-
get :index, access_token: token_string
|
269
|
-
expect(response.status).to eq 404
|
270
|
-
end
|
271
|
-
end
|
272
|
-
|
273
|
-
context 'with a text custom render' do
|
274
|
-
before do
|
275
|
-
module ControllerActions
|
276
|
-
remove_method :doorkeeper_forbidden_render_options
|
277
|
-
|
278
|
-
def doorkeeper_forbidden_render_options(*)
|
279
|
-
{ plain: 'Forbidden' }
|
280
|
-
end
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
it 'renders a custom status code and text response' do
|
285
|
-
get :index, access_token: token_string
|
286
|
-
expect(response.header).to_not include('WWW-Authenticate')
|
287
|
-
expect(response.status).to eq 403
|
288
|
-
expect(response.body).to eq('Forbidden')
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
|
-
context 'with a status and text custom render' do
|
293
|
-
before do
|
294
|
-
module ControllerActions
|
295
|
-
remove_method :doorkeeper_forbidden_render_options
|
296
|
-
|
297
|
-
def doorkeeper_forbidden_render_options(*)
|
298
|
-
{ respond_not_found_when_forbidden: true, plain: 'Not Found' }
|
299
|
-
end
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
it 'overrides the default status code' do
|
304
|
-
get :index, access_token: token_string
|
305
|
-
expect(response.status).to eq 404
|
306
|
-
end
|
307
|
-
end
|
308
|
-
end
|
309
|
-
end
|