doorkeeper 4.2.0 → 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/CHANGELOG.md +1038 -0
- data/README.md +110 -348
- data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
- data/app/controllers/doorkeeper/application_controller.rb +6 -7
- data/app/controllers/doorkeeper/application_metal_controller.rb +7 -11
- data/app/controllers/doorkeeper/applications_controller.rb +65 -20
- 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 +112 -35
- data/app/helpers/doorkeeper/dashboard_helper.rb +10 -6
- data/app/views/doorkeeper/applications/_delete_form.html.erb +4 -3
- data/app/views/doorkeeper/applications/_form.html.erb +33 -21
- data/app/views/doorkeeper/applications/edit.html.erb +1 -1
- data/app/views/doorkeeper/applications/index.html.erb +18 -6
- data/app/views/doorkeeper/applications/new.html.erb +1 -1
- data/app/views/doorkeeper/applications/show.html.erb +40 -16
- 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 +7 -1
- data/app/views/doorkeeper/authorized_applications/_delete_form.html.erb +1 -2
- data/app/views/doorkeeper/authorized_applications/index.html.erb +0 -1
- data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
- data/config/locales/en.yml +33 -9
- 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 +545 -143
- data/lib/doorkeeper/engine.rb +11 -5
- data/lib/doorkeeper/errors.rb +37 -10
- 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 +24 -12
- data/lib/doorkeeper/helpers/controller.rb +49 -27
- data/lib/doorkeeper/models/access_grant_mixin.rb +100 -21
- data/lib/doorkeeper/models/access_token_mixin.rb +379 -75
- data/lib/doorkeeper/models/application_mixin.rb +72 -25
- data/lib/doorkeeper/models/concerns/accessible.rb +6 -0
- data/lib/doorkeeper/models/concerns/expirable.rb +20 -6
- data/lib/doorkeeper/models/concerns/orderable.rb +15 -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 +12 -18
- 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 +66 -28
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
- data/lib/doorkeeper/oauth/authorization_code_request.rb +64 -14
- data/lib/doorkeeper/oauth/base_request.rb +66 -0
- data/lib/doorkeeper/oauth/base_response.rb +31 -0
- data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
- data/lib/doorkeeper/oauth/client.rb +10 -12
- 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 +11 -15
- data/lib/doorkeeper/oauth/code_request.rb +8 -12
- data/lib/doorkeeper/oauth/code_response.rb +28 -15
- data/lib/doorkeeper/oauth/error.rb +5 -3
- data/lib/doorkeeper/oauth/error_response.rb +41 -20
- 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 +53 -3
- 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 +31 -5
- data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
- data/lib/doorkeeper/oauth/password_access_token_request.rb +45 -13
- data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
- data/lib/doorkeeper/oauth/refresh_token_request.rb +61 -36
- data/lib/doorkeeper/oauth/scopes.rb +26 -12
- data/lib/doorkeeper/oauth/token.rb +25 -23
- data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
- data/lib/doorkeeper/oauth/token_request.rb +8 -21
- 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 +6 -4
- data/lib/doorkeeper/orm/active_record/access_token.rb +5 -25
- data/lib/doorkeeper/orm/active_record/application.rb +6 -15
- 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 +37 -8
- data/lib/doorkeeper/rails/helpers.rb +14 -15
- data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
- data/lib/doorkeeper/rails/routes/mapper.rb +3 -1
- data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
- data/lib/doorkeeper/rails/routes/registry.rb +45 -0
- data/lib/doorkeeper/rails/routes.rb +42 -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 +12 -4
- data/lib/doorkeeper/request/client_credentials.rb +3 -3
- data/lib/doorkeeper/request/code.rb +1 -1
- data/lib/doorkeeper/request/password.rb +5 -14
- 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 +62 -29
- 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 -19
- data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
- data/lib/doorkeeper/validations.rb +5 -2
- data/lib/doorkeeper/version.rb +12 -1
- data/lib/doorkeeper.rb +111 -56
- data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
- 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 +27 -10
- data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
- data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +31 -19
- data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
- data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
- data/lib/generators/doorkeeper/templates/{add_previous_refresh_token_to_access_tokens.rb → add_previous_refresh_token_to_access_tokens.rb.erb} +3 -1
- 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 +410 -31
- data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
- data/lib/generators/doorkeeper/views_generator.rb +8 -4
- data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
- metadata +132 -286
- data/.gitignore +0 -14
- data/.hound.yml +0 -13
- data/.rspec +0 -1
- data/.travis.yml +0 -20
- data/CONTRIBUTING.md +0 -47
- data/Gemfile +0 -14
- data/NEWS.md +0 -593
- data/RELEASING.md +0 -17
- data/Rakefile +0 -20
- data/app/validators/redirect_uri_validator.rb +0 -34
- data/doorkeeper.gemspec +0 -28
- data/lib/doorkeeper/oauth/client/methods.rb +0 -18
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
- data/lib/doorkeeper/oauth/request_concern.rb +0 -48
- data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
- data/lib/generators/doorkeeper/templates/migration.rb +0 -68
- data/spec/controllers/application_metal_controller.rb +0 -10
- data/spec/controllers/applications_controller_spec.rb +0 -58
- data/spec/controllers/authorizations_controller_spec.rb +0 -189
- data/spec/controllers/protected_resources_controller_spec.rb +0 -300
- data/spec/controllers/token_info_controller_spec.rb +0 -52
- data/spec/controllers/tokens_controller_spec.rb +0 -88
- 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/active_record_belongs_to_required_by_default.rb +0 -6
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
- data/spec/dummy/config/initializers/secret_token.rb +0 -9
- 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 -9
- data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
- data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -60
- data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -7
- data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -11
- data/spec/dummy/db/schema.rb +0 -67
- 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 -22
- data/spec/generators/install_generator_spec.rb +0 -31
- data/spec/generators/migration_generator_spec.rb +0 -20
- data/spec/generators/templates/routes.rb +0 -3
- data/spec/generators/views_generator_spec.rb +0 -27
- data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
- data/spec/lib/config_spec.rb +0 -334
- data/spec/lib/doorkeeper_spec.rb +0 -28
- data/spec/lib/models/expirable_spec.rb +0 -51
- 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 -42
- data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
- data/spec/lib/oauth/client/credentials_spec.rb +0 -47
- data/spec/lib/oauth/client/methods_spec.rb +0 -54
- 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 -104
- data/spec/lib/oauth/client_spec.rb +0 -39
- data/spec/lib/oauth/code_request_spec.rb +0 -45
- 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 -104
- data/spec/lib/oauth/invalid_token_response_spec.rb +0 -28
- data/spec/lib/oauth/password_access_token_request_spec.rb +0 -90
- data/spec/lib/oauth/pre_authorization_spec.rb +0 -155
- data/spec/lib/oauth/refresh_token_request_spec.rb +0 -154
- data/spec/lib/oauth/scopes_spec.rb +0 -122
- data/spec/lib/oauth/token_request_spec.rb +0 -98
- 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 -52
- data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
- data/spec/models/doorkeeper/access_token_spec.rb +0 -394
- data/spec/models/doorkeeper/application_spec.rb +0 -179
- 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 -72
- data/spec/requests/endpoints/token_spec.rb +0 -64
- data/spec/requests/flows/authorization_code_errors_spec.rb +0 -66
- data/spec/requests/flows/authorization_code_spec.rb +0 -156
- data/spec/requests/flows/client_credentials_spec.rb +0 -58
- 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 -115
- 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 -71
- data/spec/routing/default_routes_spec.rb +0 -35
- data/spec/routing/scoped_routes_spec.rb +0 -31
- data/spec/spec_helper.rb +0 -2
- data/spec/spec_helper_integration.rb +0 -59
- 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 -67
- data/spec/support/helpers/request_spec_helper.rb +0 -76
- data/spec/support/helpers/url_helper.rb +0 -55
- data/spec/support/http_method_shim.rb +0 -24
- data/spec/support/orm/active_record.rb +0 -3
- data/spec/support/shared/controllers_shared_context.rb +0 -69
- data/spec/support/shared/models_shared_examples.rb +0 -52
- data/spec/validators/redirect_uri_validator_spec.rb +0 -78
@@ -1,59 +0,0 @@
|
|
1
|
-
ENV['RAILS_ENV'] ||= 'test'
|
2
|
-
TABLE_NAME_PREFIX = ENV['table_name_prefix'] || nil
|
3
|
-
TABLE_NAME_SUFFIX = ENV['table_name_suffix'] || nil
|
4
|
-
|
5
|
-
orm = (ENV['BUNDLE_GEMFILE'] || '').match(/Gemfile\.(.+)\.rb/)
|
6
|
-
DOORKEEPER_ORM = (orm && orm[1] || :active_record).to_sym
|
7
|
-
|
8
|
-
$LOAD_PATH.unshift File.dirname(__FILE__)
|
9
|
-
|
10
|
-
require 'capybara/rspec'
|
11
|
-
require 'dummy/config/environment'
|
12
|
-
require 'rspec/rails'
|
13
|
-
require 'generator_spec/test_case'
|
14
|
-
require 'timecop'
|
15
|
-
require 'database_cleaner'
|
16
|
-
|
17
|
-
# Load JRuby SQLite3 if in that platform
|
18
|
-
begin
|
19
|
-
require 'jdbc/sqlite3'
|
20
|
-
Jdbc::SQLite3.load_driver
|
21
|
-
rescue LoadError
|
22
|
-
end
|
23
|
-
|
24
|
-
Rails.logger.info "====> Doorkeeper.orm = #{Doorkeeper.configuration.orm.inspect}"
|
25
|
-
if Doorkeeper.configuration.orm == :active_record
|
26
|
-
Rails.logger.info "======> active_record.table_name_prefix = #{Rails.configuration.active_record.table_name_prefix.inspect}"
|
27
|
-
Rails.logger.info "======> active_record.table_name_suffix = #{Rails.configuration.active_record.table_name_suffix.inspect}"
|
28
|
-
end
|
29
|
-
Rails.logger.info "====> Rails version: #{Rails.version}"
|
30
|
-
Rails.logger.info "====> Ruby version: #{RUBY_VERSION}"
|
31
|
-
|
32
|
-
require "support/orm/#{DOORKEEPER_ORM}"
|
33
|
-
|
34
|
-
ENGINE_RAILS_ROOT = File.join(File.dirname(__FILE__), '../')
|
35
|
-
|
36
|
-
Dir["#{File.dirname(__FILE__)}/support/{dependencies,helpers,shared}/*.rb"].each { |f| require f }
|
37
|
-
|
38
|
-
# Remove after dropping support of Rails 4.2
|
39
|
-
require "#{File.dirname(__FILE__)}/support/http_method_shim.rb"
|
40
|
-
|
41
|
-
RSpec.configure do |config|
|
42
|
-
config.infer_spec_type_from_file_location!
|
43
|
-
config.mock_with :rspec
|
44
|
-
|
45
|
-
config.infer_base_class_for_anonymous_controllers = false
|
46
|
-
|
47
|
-
config.include RSpec::Rails::RequestExampleGroup, type: :request
|
48
|
-
|
49
|
-
config.before do
|
50
|
-
DatabaseCleaner.start
|
51
|
-
Doorkeeper.configure { orm DOORKEEPER_ORM }
|
52
|
-
end
|
53
|
-
|
54
|
-
config.after do
|
55
|
-
DatabaseCleaner.clean
|
56
|
-
end
|
57
|
-
|
58
|
-
config.order = 'random'
|
59
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
module AccessTokenRequestHelper
|
2
|
-
def client_is_authorized(client, resource_owner, access_token_attributes = {})
|
3
|
-
attributes = {
|
4
|
-
application: client,
|
5
|
-
resource_owner_id: resource_owner.id
|
6
|
-
}.merge(access_token_attributes)
|
7
|
-
FactoryGirl.create(:access_token, attributes)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
RSpec.configuration.send :include, AccessTokenRequestHelper
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module AuthorizationRequestHelper
|
2
|
-
def resource_owner_is_authenticated(resource_owner = nil)
|
3
|
-
resource_owner ||= User.create!(name: 'Joe', password: 'sekret')
|
4
|
-
Doorkeeper.configuration.instance_variable_set(:@authenticate_resource_owner, proc { resource_owner })
|
5
|
-
end
|
6
|
-
|
7
|
-
def resource_owner_is_not_authenticated
|
8
|
-
Doorkeeper.configuration.instance_variable_set(:@authenticate_resource_owner, proc { redirect_to('/sign_in') })
|
9
|
-
end
|
10
|
-
|
11
|
-
def default_scopes_exist(*scopes)
|
12
|
-
Doorkeeper.configuration.instance_variable_set(:@default_scopes, Doorkeeper::OAuth::Scopes.from_array(scopes))
|
13
|
-
end
|
14
|
-
|
15
|
-
def optional_scopes_exist(*scopes)
|
16
|
-
Doorkeeper.configuration.instance_variable_set(:@optional_scopes, Doorkeeper::OAuth::Scopes.from_array(scopes))
|
17
|
-
end
|
18
|
-
|
19
|
-
def client_should_be_authorized(client)
|
20
|
-
expect(client.access_grants.size).to eq(1)
|
21
|
-
end
|
22
|
-
|
23
|
-
def client_should_not_be_authorized(client)
|
24
|
-
expect(client.size).to eq(0)
|
25
|
-
end
|
26
|
-
|
27
|
-
def i_should_be_on_client_callback(client)
|
28
|
-
expect(client.redirect_uri).to eq("#{current_uri.scheme}://#{current_uri.host}#{current_uri.path}")
|
29
|
-
end
|
30
|
-
|
31
|
-
def allowing_forgery_protection(&block)
|
32
|
-
_original_value = ActionController::Base.allow_forgery_protection
|
33
|
-
ActionController::Base.allow_forgery_protection = true
|
34
|
-
|
35
|
-
block.call
|
36
|
-
ensure
|
37
|
-
ActionController::Base.allow_forgery_protection = _original_value
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
RSpec.configuration.send :include, AuthorizationRequestHelper
|
@@ -1,9 +0,0 @@
|
|
1
|
-
module ConfigHelper
|
2
|
-
def config_is_set(setting, value = nil, &block)
|
3
|
-
setting_ivar = "@#{setting}"
|
4
|
-
value = block_given? ? block : value
|
5
|
-
Doorkeeper.configuration.instance_variable_set(setting_ivar, value)
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
RSpec.configuration.send :include, ConfigHelper
|
@@ -1,67 +0,0 @@
|
|
1
|
-
module ModelHelper
|
2
|
-
def client_exists(client_attributes = {})
|
3
|
-
@client = FactoryGirl.create(:application, client_attributes)
|
4
|
-
end
|
5
|
-
|
6
|
-
def create_resource_owner
|
7
|
-
@resource_owner = User.create!(name: 'Joe', password: 'sekret')
|
8
|
-
end
|
9
|
-
|
10
|
-
def authorization_code_exists(options = {})
|
11
|
-
@authorization = FactoryGirl.create(:access_grant, options)
|
12
|
-
end
|
13
|
-
|
14
|
-
def access_grant_should_exist_for(client, resource_owner)
|
15
|
-
grant = Doorkeeper::AccessGrant.first
|
16
|
-
|
17
|
-
expect(grant.application).to have_attributes(id: client.id).
|
18
|
-
and(be_instance_of(Doorkeeper::Application))
|
19
|
-
|
20
|
-
expect(grant.resource_owner_id).to eq(resource_owner.id)
|
21
|
-
end
|
22
|
-
|
23
|
-
def access_token_should_exist_for(client, resource_owner)
|
24
|
-
token = Doorkeeper::AccessToken.first
|
25
|
-
|
26
|
-
expect(token.application).to have_attributes(id: client.id).
|
27
|
-
and(be_instance_of(Doorkeeper::Application))
|
28
|
-
|
29
|
-
expect(token.resource_owner_id).to eq(resource_owner.id)
|
30
|
-
end
|
31
|
-
|
32
|
-
def access_grant_should_not_exist
|
33
|
-
expect(Doorkeeper::AccessGrant.all).to be_empty
|
34
|
-
end
|
35
|
-
|
36
|
-
def access_token_should_not_exist
|
37
|
-
expect(Doorkeeper::AccessToken.all).to be_empty
|
38
|
-
end
|
39
|
-
|
40
|
-
def access_grant_should_have_scopes(*args)
|
41
|
-
grant = Doorkeeper::AccessGrant.first
|
42
|
-
expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
|
43
|
-
end
|
44
|
-
|
45
|
-
def access_token_should_have_scopes(*args)
|
46
|
-
grant = Doorkeeper::AccessToken.last
|
47
|
-
expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
|
48
|
-
end
|
49
|
-
|
50
|
-
def uniqueness_error
|
51
|
-
case DOORKEEPER_ORM
|
52
|
-
when :active_record
|
53
|
-
ActiveRecord::RecordNotUnique
|
54
|
-
when :sequel
|
55
|
-
error_classes = [Sequel::UniqueConstraintViolation, Sequel::ValidationFailed]
|
56
|
-
proc { |error| expect(error.class).to be_in(error_classes) }
|
57
|
-
when :mongo_mapper
|
58
|
-
MongoMapper::DocumentNotValid
|
59
|
-
when /mongoid/
|
60
|
-
Mongoid::Errors::Validations
|
61
|
-
else
|
62
|
-
raise "'#{DOORKEEPER_ORM}' ORM is not supported!"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
RSpec.configuration.send :include, ModelHelper
|
@@ -1,76 +0,0 @@
|
|
1
|
-
module RequestSpecHelper
|
2
|
-
def i_should_see(content)
|
3
|
-
expect(page).to have_content(content)
|
4
|
-
end
|
5
|
-
|
6
|
-
def i_should_not_see(content)
|
7
|
-
expect(page).to have_no_content(content)
|
8
|
-
end
|
9
|
-
|
10
|
-
def i_should_be_on(path)
|
11
|
-
expect(current_path).to eq(path)
|
12
|
-
end
|
13
|
-
|
14
|
-
def url_should_have_param(param, value)
|
15
|
-
expect(current_params[param]).to eq(value)
|
16
|
-
end
|
17
|
-
|
18
|
-
def url_should_not_have_param(param)
|
19
|
-
expect(current_params).not_to have_key(param)
|
20
|
-
end
|
21
|
-
|
22
|
-
def current_params
|
23
|
-
Rack::Utils.parse_query(current_uri.query)
|
24
|
-
end
|
25
|
-
|
26
|
-
def current_uri
|
27
|
-
URI.parse(page.current_url)
|
28
|
-
end
|
29
|
-
|
30
|
-
def should_have_header(header, value)
|
31
|
-
expect(headers[header]).to eq(value)
|
32
|
-
end
|
33
|
-
|
34
|
-
def with_access_token_header(token)
|
35
|
-
with_header 'Authorization', "Bearer #{token}"
|
36
|
-
end
|
37
|
-
|
38
|
-
def with_header(header, value)
|
39
|
-
page.driver.header header, value
|
40
|
-
end
|
41
|
-
|
42
|
-
def basic_auth_header_for_client(client)
|
43
|
-
ActionController::HttpAuthentication::Basic.encode_credentials client.uid, client.secret
|
44
|
-
end
|
45
|
-
|
46
|
-
def should_have_json(key, value)
|
47
|
-
expect(JSON.parse(response.body).fetch(key)).to eq(value)
|
48
|
-
end
|
49
|
-
|
50
|
-
def should_have_json_within(key, value, range)
|
51
|
-
expect(JSON.parse(response.body).fetch(key)).to be_within(range).of(value)
|
52
|
-
end
|
53
|
-
|
54
|
-
def should_not_have_json(key)
|
55
|
-
expect(JSON.parse(response.body)).not_to have_key(key)
|
56
|
-
end
|
57
|
-
|
58
|
-
def sign_in
|
59
|
-
visit '/'
|
60
|
-
click_on 'Sign in'
|
61
|
-
end
|
62
|
-
|
63
|
-
def i_should_see_translated_error_message(key)
|
64
|
-
i_should_see translated_error_message(key)
|
65
|
-
end
|
66
|
-
|
67
|
-
def translated_error_message(key)
|
68
|
-
I18n.translate key, scope: [:doorkeeper, :errors, :messages]
|
69
|
-
end
|
70
|
-
|
71
|
-
def response_status_should_be(status)
|
72
|
-
expect(page.driver.response.status.to_i).to eq(status)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
RSpec.configuration.send :include, RequestSpecHelper
|
@@ -1,55 +0,0 @@
|
|
1
|
-
module UrlHelper
|
2
|
-
def token_endpoint_url(options = {})
|
3
|
-
parameters = {
|
4
|
-
code: options[:code],
|
5
|
-
client_id: options[:client_id] || (options[:client] ? options[:client].uid : nil),
|
6
|
-
client_secret: options[:client_secret] || (options[:client] ? options[:client].secret : nil),
|
7
|
-
redirect_uri: options[:redirect_uri] || (options[:client] ? options[:client].redirect_uri : nil),
|
8
|
-
grant_type: options[:grant_type] || 'authorization_code'
|
9
|
-
}
|
10
|
-
"/oauth/token?#{build_query(parameters)}"
|
11
|
-
end
|
12
|
-
|
13
|
-
def password_token_endpoint_url(options = {})
|
14
|
-
parameters = {
|
15
|
-
code: options[:code],
|
16
|
-
client_id: options[:client_id] || (options[:client] ? options[:client].uid : nil),
|
17
|
-
client_secret: options[:client_secret] || (options[:client] ? options[:client].secret : nil),
|
18
|
-
username: options[:resource_owner_username] || (options[:resource_owner] ? options[:resource_owner].name : nil),
|
19
|
-
password: options[:resource_owner_password] || (options[:resource_owner] ? options[:resource_owner].password : nil),
|
20
|
-
grant_type: 'password'
|
21
|
-
}
|
22
|
-
"/oauth/token?#{build_query(parameters)}"
|
23
|
-
end
|
24
|
-
|
25
|
-
def authorization_endpoint_url(options = {})
|
26
|
-
parameters = {
|
27
|
-
client_id: options[:client_id] || options[:client].uid,
|
28
|
-
redirect_uri: options[:redirect_uri] || options[:client].redirect_uri,
|
29
|
-
response_type: options[:response_type] || 'code',
|
30
|
-
scope: options[:scope],
|
31
|
-
state: options[:state]
|
32
|
-
}.reject { |k, v| v.blank? }
|
33
|
-
"/oauth/authorize?#{build_query(parameters)}"
|
34
|
-
end
|
35
|
-
|
36
|
-
def refresh_token_endpoint_url(options = {})
|
37
|
-
parameters = {
|
38
|
-
refresh_token: options[:refresh_token],
|
39
|
-
client_id: options[:client_id] || options[:client].uid,
|
40
|
-
client_secret: options[:client_secret] || options[:client].secret,
|
41
|
-
grant_type: options[:grant_type] || 'refresh_token'
|
42
|
-
}
|
43
|
-
"/oauth/token?#{build_query(parameters)}"
|
44
|
-
end
|
45
|
-
|
46
|
-
def revocation_token_endpoint_url
|
47
|
-
'/oauth/revoke'
|
48
|
-
end
|
49
|
-
|
50
|
-
def build_query(hash)
|
51
|
-
Rack::Utils.build_query(hash)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
RSpec.configuration.send :include, UrlHelper
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# Rails 5 deprecates calling HTTP action methods with positional arguments
|
2
|
-
# in favor of keyword arguments. However, the keyword argument form is only
|
3
|
-
# supported in Rails 5+. Since we support back to 4, we need some sort of shim
|
4
|
-
# to avoid super noisy deprecations when running tests.
|
5
|
-
module HTTPMethodShim
|
6
|
-
def get(path, params = nil, headers = nil)
|
7
|
-
super(path, params: params, headers: headers)
|
8
|
-
end
|
9
|
-
|
10
|
-
def post(path, params = nil, headers = nil)
|
11
|
-
super(path, params: params, headers: headers)
|
12
|
-
end
|
13
|
-
|
14
|
-
def put(path, params = nil, headers = nil)
|
15
|
-
super(path, params: params, headers: headers)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
if ::Rails::VERSION::MAJOR >= 5
|
20
|
-
RSpec.configure do |config|
|
21
|
-
config.include HTTPMethodShim, type: :controller
|
22
|
-
config.include HTTPMethodShim, type: :request
|
23
|
-
end
|
24
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
shared_context 'valid token', token: :valid do
|
2
|
-
let :token_string do
|
3
|
-
'1A2B3C4D'
|
4
|
-
end
|
5
|
-
|
6
|
-
let :token do
|
7
|
-
double(Doorkeeper::AccessToken,
|
8
|
-
accessible?: true, includes_scope?: true, acceptable?: true,
|
9
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true)
|
10
|
-
end
|
11
|
-
|
12
|
-
before :each do
|
13
|
-
allow(
|
14
|
-
Doorkeeper::AccessToken
|
15
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
shared_context 'invalid token', token: :invalid do
|
20
|
-
let :token_string do
|
21
|
-
'1A2B3C4D'
|
22
|
-
end
|
23
|
-
|
24
|
-
let :token do
|
25
|
-
double(Doorkeeper::AccessToken,
|
26
|
-
accessible?: false, revoked?: false, expired?: false,
|
27
|
-
includes_scope?: false, acceptable?: false,
|
28
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true)
|
29
|
-
end
|
30
|
-
|
31
|
-
before :each do
|
32
|
-
allow(
|
33
|
-
Doorkeeper::AccessToken
|
34
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
shared_context 'authenticated resource owner' do
|
39
|
-
before do
|
40
|
-
user = double(:resource, id: 1)
|
41
|
-
allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { user } }
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
shared_context 'not authenticated resource owner' do
|
46
|
-
before do
|
47
|
-
allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { redirect_to '/' } }
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
shared_context 'valid authorization request' do
|
52
|
-
let :authorization do
|
53
|
-
double(:authorization, valid?: true, authorize: true, success_redirect_uri: 'http://something.com/cb?code=token')
|
54
|
-
end
|
55
|
-
|
56
|
-
before do
|
57
|
-
allow(controller).to receive(:authorization) { authorization }
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
shared_context 'invalid authorization request' do
|
62
|
-
let :authorization do
|
63
|
-
double(:authorization, valid?: false, authorize: false, redirect_on_error?: false)
|
64
|
-
end
|
65
|
-
|
66
|
-
before do
|
67
|
-
allow(controller).to receive(:authorization) { authorization }
|
68
|
-
end
|
69
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
shared_examples 'an accessible token' do
|
2
|
-
describe :accessible? do
|
3
|
-
it 'is accessible if token is not expired' do
|
4
|
-
allow(subject).to receive(:expired?).and_return(false)
|
5
|
-
should be_accessible
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'is not accessible if token is expired' do
|
9
|
-
allow(subject).to receive(:expired?).and_return(true)
|
10
|
-
should_not be_accessible
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
shared_examples 'a revocable token' do
|
16
|
-
describe :accessible? do
|
17
|
-
before { subject.save! }
|
18
|
-
|
19
|
-
it 'is accessible if token is not revoked' do
|
20
|
-
expect(subject).to be_accessible
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'is not accessible if token is revoked' do
|
24
|
-
subject.revoke
|
25
|
-
expect(subject).not_to be_accessible
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
shared_examples 'a unique token' do
|
31
|
-
describe :token do
|
32
|
-
it 'is generated before validation' do
|
33
|
-
expect { subject.valid? }.to change { subject.token }.from(nil)
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'is not valid if token exists' do
|
37
|
-
token1 = FactoryGirl.create factory_name
|
38
|
-
token2 = FactoryGirl.create factory_name
|
39
|
-
token2.token = token1.token
|
40
|
-
expect(token2).not_to be_valid
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'expects database to throw an error when tokens are the same' do
|
44
|
-
token1 = FactoryGirl.create factory_name
|
45
|
-
token2 = FactoryGirl.create factory_name
|
46
|
-
token2.token = token1.token
|
47
|
-
expect do
|
48
|
-
token2.save!(validate: false)
|
49
|
-
end.to raise_error(uniqueness_error)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
require 'spec_helper_integration'
|
2
|
-
|
3
|
-
describe RedirectUriValidator do
|
4
|
-
subject do
|
5
|
-
FactoryGirl.create(:application)
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'is valid when the uri is a uri' do
|
9
|
-
subject.redirect_uri = 'https://example.com/callback'
|
10
|
-
expect(subject).to be_valid
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'accepts native redirect uri' do
|
14
|
-
subject.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
|
15
|
-
expect(subject).to be_valid
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'rejects if test uri is disabled' do
|
19
|
-
allow(RedirectUriValidator).to receive(:native_redirect_uri).and_return(nil)
|
20
|
-
subject.redirect_uri = 'urn:some:test'
|
21
|
-
expect(subject).not_to be_valid
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'is invalid when the uri is not a uri' do
|
25
|
-
subject.redirect_uri = ']'
|
26
|
-
expect(subject).not_to be_valid
|
27
|
-
expect(subject.errors[:redirect_uri].first).to eq('must be a valid URI.')
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'is invalid when the uri is relative' do
|
31
|
-
subject.redirect_uri = '/abcd'
|
32
|
-
expect(subject).not_to be_valid
|
33
|
-
expect(subject.errors[:redirect_uri].first).to eq('must be an absolute URI.')
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'is invalid when the uri has a fragment' do
|
37
|
-
subject.redirect_uri = 'https://example.com/abcd#xyz'
|
38
|
-
expect(subject).not_to be_valid
|
39
|
-
expect(subject.errors[:redirect_uri].first).to eq('cannot contain a fragment.')
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'is invalid when the uri has a query parameter' do
|
43
|
-
subject.redirect_uri = 'https://example.com/abcd?xyz=123'
|
44
|
-
expect(subject).to be_valid
|
45
|
-
end
|
46
|
-
|
47
|
-
context 'force secured uri' do
|
48
|
-
it 'accepts an valid uri' do
|
49
|
-
subject.redirect_uri = 'https://example.com/callback'
|
50
|
-
expect(subject).to be_valid
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'accepts native redirect uri' do
|
54
|
-
subject.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
|
55
|
-
expect(subject).to be_valid
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'accepts app redirect uri' do
|
59
|
-
subject.redirect_uri = 'some-awesome-app://oauth/callback'
|
60
|
-
expect(subject).to be_valid
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'accepts a non secured protocol when disabled' do
|
64
|
-
subject.redirect_uri = 'http://example.com/callback'
|
65
|
-
allow(Doorkeeper.configuration).to receive(
|
66
|
-
:force_ssl_in_redirect_uri
|
67
|
-
).and_return(false)
|
68
|
-
expect(subject).to be_valid
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'invalidates the uri when the uri does not use a secure protocol' do
|
72
|
-
subject.redirect_uri = 'http://example.com/callback'
|
73
|
-
expect(subject).not_to be_valid
|
74
|
-
error = subject.errors[:redirect_uri].first
|
75
|
-
expect(error).to eq('must be an HTTPS/SSL URI.')
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|