doorkeeper 5.1.2 → 5.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/{NEWS.md → CHANGELOG.md} +314 -27
- data/README.md +39 -22
- data/app/controllers/doorkeeper/application_controller.rb +3 -2
- data/app/controllers/doorkeeper/application_metal_controller.rb +3 -2
- data/app/controllers/doorkeeper/applications_controller.rb +5 -4
- data/app/controllers/doorkeeper/authorizations_controller.rb +76 -25
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +5 -5
- data/app/controllers/doorkeeper/token_info_controller.rb +12 -2
- data/app/controllers/doorkeeper/tokens_controller.rb +99 -28
- data/app/helpers/doorkeeper/dashboard_helper.rb +1 -1
- data/app/views/doorkeeper/applications/_form.html.erb +1 -7
- data/app/views/doorkeeper/applications/show.html.erb +35 -14
- data/app/views/doorkeeper/authorizations/error.html.erb +3 -1
- data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
- data/app/views/doorkeeper/authorizations/new.html.erb +16 -14
- data/config/locales/en.yml +16 -3
- data/lib/doorkeeper/config/abstract_builder.rb +28 -0
- data/lib/doorkeeper/config/option.rb +20 -2
- data/lib/doorkeeper/config/validations.rb +53 -0
- data/lib/doorkeeper/config.rb +300 -136
- data/lib/doorkeeper/engine.rb +10 -3
- data/lib/doorkeeper/errors.rb +13 -18
- 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/helpers.rb +7 -3
- data/lib/doorkeeper/helpers/controller.rb +36 -11
- data/lib/doorkeeper/models/access_grant_mixin.rb +23 -19
- data/lib/doorkeeper/models/access_token_mixin.rb +195 -52
- data/lib/doorkeeper/models/application_mixin.rb +8 -7
- data/lib/doorkeeper/models/concerns/expirable.rb +1 -1
- data/lib/doorkeeper/models/concerns/expiration_time_sql_math.rb +88 -0
- data/lib/doorkeeper/models/concerns/ownership.rb +1 -1
- data/lib/doorkeeper/models/concerns/polymorphic_resource_owner.rb +30 -0
- data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
- data/lib/doorkeeper/models/concerns/reusable.rb +1 -1
- data/lib/doorkeeper/models/concerns/revocable.rb +1 -28
- data/lib/doorkeeper/models/concerns/scopes.rb +5 -1
- data/lib/doorkeeper/models/concerns/secret_storable.rb +1 -3
- data/lib/doorkeeper/oauth/authorization/code.rb +31 -14
- data/lib/doorkeeper/oauth/authorization/context.rb +5 -5
- data/lib/doorkeeper/oauth/authorization/token.rb +30 -19
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +4 -4
- data/lib/doorkeeper/oauth/authorization_code_request.rb +51 -22
- data/lib/doorkeeper/oauth/base_request.rb +21 -22
- data/lib/doorkeeper/oauth/client/credentials.rb +2 -4
- data/lib/doorkeeper/oauth/client.rb +8 -9
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +42 -5
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +10 -8
- data/lib/doorkeeper/oauth/client_credentials/{validation.rb → validator.rb} +14 -5
- data/lib/doorkeeper/oauth/client_credentials_request.rb +8 -7
- data/lib/doorkeeper/oauth/code_request.rb +6 -12
- data/lib/doorkeeper/oauth/code_response.rb +24 -14
- data/lib/doorkeeper/oauth/error.rb +1 -1
- data/lib/doorkeeper/oauth/error_response.rb +11 -13
- data/lib/doorkeeper/oauth/forbidden_token_response.rb +2 -1
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +8 -12
- data/lib/doorkeeper/oauth/helpers/unique_token.rb +10 -7
- data/lib/doorkeeper/oauth/helpers/uri_checker.rb +19 -23
- 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 +7 -4
- data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
- data/lib/doorkeeper/oauth/password_access_token_request.rb +34 -11
- data/lib/doorkeeper/oauth/pre_authorization.rb +114 -44
- data/lib/doorkeeper/oauth/refresh_token_request.rb +54 -34
- data/lib/doorkeeper/oauth/token.rb +6 -7
- data/lib/doorkeeper/oauth/token_introspection.rb +28 -22
- data/lib/doorkeeper/oauth/token_request.rb +6 -20
- data/lib/doorkeeper/oauth/token_response.rb +2 -3
- data/lib/doorkeeper/orm/active_record/access_grant.rb +4 -43
- data/lib/doorkeeper/orm/active_record/access_token.rb +4 -35
- data/lib/doorkeeper/orm/active_record/application.rb +5 -149
- data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +63 -0
- data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +77 -0
- data/lib/doorkeeper/orm/active_record/mixins/application.rb +210 -0
- data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
- data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +5 -2
- data/lib/doorkeeper/orm/active_record.rb +29 -22
- data/lib/doorkeeper/rails/helpers.rb +4 -4
- data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
- data/lib/doorkeeper/rails/routes/mapper.rb +2 -2
- data/lib/doorkeeper/rails/routes/registry.rb +45 -0
- data/lib/doorkeeper/rails/routes.rb +28 -27
- data/lib/doorkeeper/rake/db.rake +6 -6
- data/lib/doorkeeper/request/authorization_code.rb +5 -3
- data/lib/doorkeeper/request/client_credentials.rb +2 -2
- data/lib/doorkeeper/request/password.rb +3 -2
- data/lib/doorkeeper/request/refresh_token.rb +5 -4
- data/lib/doorkeeper/request/strategy.rb +2 -2
- data/lib/doorkeeper/request.rb +49 -17
- data/lib/doorkeeper/server.rb +7 -11
- data/lib/doorkeeper/stale_records_cleaner.rb +6 -2
- data/lib/doorkeeper/version.rb +2 -6
- data/lib/doorkeeper.rb +183 -80
- data/lib/generators/doorkeeper/application_owner_generator.rb +1 -1
- data/lib/generators/doorkeeper/confidential_applications_generator.rb +2 -2
- data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
- data/lib/generators/doorkeeper/migration_generator.rb +1 -1
- data/lib/generators/doorkeeper/pkce_generator.rb +1 -1
- data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +7 -7
- 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 +2 -0
- data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
- data/lib/generators/doorkeeper/templates/initializer.rb +230 -50
- data/lib/generators/doorkeeper/templates/migration.rb.erb +31 -9
- metadata +61 -327
- data/.coveralls.yml +0 -1
- data/.github/ISSUE_TEMPLATE.md +0 -25
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
- data/.gitignore +0 -20
- data/.gitlab-ci.yml +0 -16
- data/.hound.yml +0 -3
- data/.rspec +0 -1
- data/.rubocop.yml +0 -50
- data/.travis.yml +0 -35
- data/Appraisals +0 -40
- data/CODE_OF_CONDUCT.md +0 -46
- data/CONTRIBUTING.md +0 -47
- data/Dangerfile +0 -67
- data/Gemfile +0 -24
- data/RELEASING.md +0 -10
- data/Rakefile +0 -28
- data/SECURITY.md +0 -15
- data/UPGRADE.md +0 -2
- data/app/validators/redirect_uri_validator.rb +0 -50
- data/bin/console +0 -16
- data/doorkeeper.gemspec +0 -34
- data/gemfiles/rails_5_0.gemfile +0 -17
- data/gemfiles/rails_5_1.gemfile +0 -17
- data/gemfiles/rails_5_2.gemfile +0 -17
- data/gemfiles/rails_6_0.gemfile +0 -17
- data/gemfiles/rails_master.gemfile +0 -17
- data/spec/controllers/application_metal_controller_spec.rb +0 -64
- data/spec/controllers/applications_controller_spec.rb +0 -180
- data/spec/controllers/authorizations_controller_spec.rb +0 -527
- data/spec/controllers/protected_resources_controller_spec.rb +0 -353
- data/spec/controllers/token_info_controller_spec.rb +0 -50
- data/spec/controllers/tokens_controller_spec.rb +0 -330
- data/spec/dummy/Rakefile +0 -9
- data/spec/dummy/app/assets/config/manifest.js +0 -2
- data/spec/dummy/app/controllers/application_controller.rb +0 -5
- data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
- data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
- data/spec/dummy/app/controllers/home_controller.rb +0 -18
- data/spec/dummy/app/controllers/metal_controller.rb +0 -13
- data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
- data/spec/dummy/app/helpers/application_helper.rb +0 -7
- data/spec/dummy/app/models/user.rb +0 -7
- 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 -47
- data/spec/dummy/config/boot.rb +0 -7
- data/spec/dummy/config/database.yml +0 -15
- data/spec/dummy/config/environment.rb +0 -5
- data/spec/dummy/config/environments/development.rb +0 -31
- data/spec/dummy/config/environments/production.rb +0 -64
- data/spec/dummy/config/environments/test.rb +0 -45
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
- data/spec/dummy/config/initializers/doorkeeper.rb +0 -121
- data/spec/dummy/config/initializers/secret_token.rb +0 -10
- data/spec/dummy/config/initializers/session_store.rb +0 -10
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
- data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
- data/spec/dummy/config/routes.rb +0 -13
- data/spec/dummy/config.ru +0 -6
- 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 -69
- 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/migrate/20170822064514_enable_pkce.rb +0 -8
- data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.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 -9
- data/spec/factories.rb +0 -30
- data/spec/generators/application_owner_generator_spec.rb +0 -28
- data/spec/generators/confidential_applications_generator_spec.rb +0 -29
- data/spec/generators/install_generator_spec.rb +0 -36
- data/spec/generators/migration_generator_spec.rb +0 -28
- data/spec/generators/pkce_generator_spec.rb +0 -28
- data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
- data/spec/generators/templates/routes.rb +0 -4
- data/spec/generators/views_generator_spec.rb +0 -29
- data/spec/grape/grape_integration_spec.rb +0 -137
- data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
- data/spec/lib/config_spec.rb +0 -697
- data/spec/lib/doorkeeper_spec.rb +0 -27
- data/spec/lib/models/expirable_spec.rb +0 -61
- data/spec/lib/models/reusable_spec.rb +0 -40
- data/spec/lib/models/revocable_spec.rb +0 -59
- data/spec/lib/models/scopes_spec.rb +0 -53
- data/spec/lib/models/secret_storable_spec.rb +0 -135
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
- data/spec/lib/oauth/authorization_code_request_spec.rb +0 -156
- data/spec/lib/oauth/base_request_spec.rb +0 -205
- data/spec/lib/oauth/base_response_spec.rb +0 -47
- data/spec/lib/oauth/client/credentials_spec.rb +0 -90
- data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -94
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -112
- data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -59
- data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -29
- data/spec/lib/oauth/client_credentials_request_spec.rb +0 -109
- data/spec/lib/oauth/client_spec.rb +0 -38
- data/spec/lib/oauth/code_request_spec.rb +0 -47
- data/spec/lib/oauth/code_response_spec.rb +0 -36
- data/spec/lib/oauth/error_response_spec.rb +0 -66
- data/spec/lib/oauth/error_spec.rb +0 -23
- data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -22
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -98
- data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
- data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -247
- data/spec/lib/oauth/invalid_token_response_spec.rb +0 -55
- data/spec/lib/oauth/password_access_token_request_spec.rb +0 -192
- data/spec/lib/oauth/pre_authorization_spec.rb +0 -215
- data/spec/lib/oauth/refresh_token_request_spec.rb +0 -177
- data/spec/lib/oauth/scopes_spec.rb +0 -148
- data/spec/lib/oauth/token_request_spec.rb +0 -150
- data/spec/lib/oauth/token_response_spec.rb +0 -86
- data/spec/lib/oauth/token_spec.rb +0 -158
- data/spec/lib/request/strategy_spec.rb +0 -54
- data/spec/lib/secret_storing/base_spec.rb +0 -60
- data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
- data/spec/lib/secret_storing/plain_spec.rb +0 -44
- data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
- data/spec/lib/server_spec.rb +0 -61
- data/spec/lib/stale_records_cleaner_spec.rb +0 -89
- data/spec/models/doorkeeper/access_grant_spec.rb +0 -144
- data/spec/models/doorkeeper/access_token_spec.rb +0 -591
- data/spec/models/doorkeeper/application_spec.rb +0 -472
- data/spec/requests/applications/applications_request_spec.rb +0 -259
- data/spec/requests/applications/authorized_applications_spec.rb +0 -32
- data/spec/requests/endpoints/authorization_spec.rb +0 -73
- data/spec/requests/endpoints/token_spec.rb +0 -75
- data/spec/requests/flows/authorization_code_errors_spec.rb +0 -78
- data/spec/requests/flows/authorization_code_spec.rb +0 -447
- data/spec/requests/flows/client_credentials_spec.rb +0 -128
- data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -34
- data/spec/requests/flows/implicit_grant_spec.rb +0 -90
- data/spec/requests/flows/password_spec.rb +0 -259
- data/spec/requests/flows/refresh_token_spec.rb +0 -233
- data/spec/requests/flows/revoke_token_spec.rb +0 -143
- data/spec/requests/flows/skip_authorization_spec.rb +0 -66
- data/spec/requests/protected_resources/metal_spec.rb +0 -16
- data/spec/requests/protected_resources/private_api_spec.rb +0 -83
- data/spec/routing/custom_controller_routes_spec.rb +0 -133
- data/spec/routing/default_routes_spec.rb +0 -41
- data/spec/routing/scoped_routes_spec.rb +0 -47
- data/spec/spec_helper.rb +0 -57
- data/spec/spec_helper_integration.rb +0 -4
- data/spec/support/dependencies/factory_bot.rb +0 -4
- data/spec/support/doorkeeper_rspec.rb +0 -22
- data/spec/support/helpers/access_token_request_helper.rb +0 -13
- data/spec/support/helpers/authorization_request_helper.rb +0 -43
- data/spec/support/helpers/config_helper.rb +0 -11
- data/spec/support/helpers/model_helper.rb +0 -78
- data/spec/support/helpers/request_spec_helper.rb +0 -98
- data/spec/support/helpers/url_helper.rb +0 -62
- data/spec/support/http_method_shim.rb +0 -29
- data/spec/support/orm/active_record.rb +0 -5
- data/spec/support/shared/controllers_shared_context.rb +0 -123
- data/spec/support/shared/hashing_shared_context.rb +0 -36
- data/spec/support/shared/models_shared_examples.rb +0 -54
- data/spec/validators/redirect_uri_validator_spec.rb +0 -158
- data/spec/version/version_spec.rb +0 -17
@@ -1,62 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module UrlHelper
|
4
|
-
def token_endpoint_url(options = {})
|
5
|
-
parameters = {
|
6
|
-
code: options[:code],
|
7
|
-
client_id: options[:client_id] || options[:client].try(:uid),
|
8
|
-
client_secret: options[:client_secret] || options[:client].try(:secret),
|
9
|
-
redirect_uri: options[:redirect_uri] || options[:client].try(:redirect_uri),
|
10
|
-
grant_type: options[:grant_type] || "authorization_code",
|
11
|
-
code_verifier: options[:code_verifier],
|
12
|
-
code_challenge_method: options[:code_challenge_method],
|
13
|
-
}.reject { |_, v| v.blank? }
|
14
|
-
"/oauth/token?#{build_query(parameters)}"
|
15
|
-
end
|
16
|
-
|
17
|
-
def password_token_endpoint_url(options = {})
|
18
|
-
parameters = {
|
19
|
-
code: options[:code],
|
20
|
-
client_id: options[:client_id] || options[:client].try(:uid),
|
21
|
-
client_secret: options[:client_secret] || options[:client].try(:secret),
|
22
|
-
username: options[:resource_owner_username] || options[:resource_owner].try(:name),
|
23
|
-
password: options[:resource_owner_password] || options[:resource_owner].try(:password),
|
24
|
-
scope: options[:scope],
|
25
|
-
grant_type: "password",
|
26
|
-
}
|
27
|
-
"/oauth/token?#{build_query(parameters)}"
|
28
|
-
end
|
29
|
-
|
30
|
-
def authorization_endpoint_url(options = {})
|
31
|
-
parameters = {
|
32
|
-
client_id: options[:client_id] || options[:client].try(:uid),
|
33
|
-
redirect_uri: options[:redirect_uri] || options[:client].try(:redirect_uri),
|
34
|
-
response_type: options[:response_type] || "code",
|
35
|
-
scope: options[:scope],
|
36
|
-
state: options[:state],
|
37
|
-
code_challenge: options[:code_challenge],
|
38
|
-
code_challenge_method: options[:code_challenge_method],
|
39
|
-
}.reject { |_, v| v.blank? }
|
40
|
-
"/oauth/authorize?#{build_query(parameters)}"
|
41
|
-
end
|
42
|
-
|
43
|
-
def refresh_token_endpoint_url(options = {})
|
44
|
-
parameters = {
|
45
|
-
refresh_token: options[:refresh_token],
|
46
|
-
client_id: options[:client_id] || options[:client].try(:uid),
|
47
|
-
client_secret: options[:client_secret] || options[:client].try(:secret),
|
48
|
-
grant_type: options[:grant_type] || "refresh_token",
|
49
|
-
}
|
50
|
-
"/oauth/token?#{build_query(parameters)}"
|
51
|
-
end
|
52
|
-
|
53
|
-
def revocation_token_endpoint_url
|
54
|
-
"/oauth/revoke"
|
55
|
-
end
|
56
|
-
|
57
|
-
def build_query(hash)
|
58
|
-
Rack::Utils.build_query(hash)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
RSpec.configuration.send :include, UrlHelper
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Rails 5 deprecates calling HTTP action methods with positional arguments
|
4
|
-
# in favor of keyword arguments. However, the keyword argument form is only
|
5
|
-
# supported in Rails 5+. Since we support back to 4, we need some sort of shim
|
6
|
-
# to avoid super noisy deprecations when running tests.
|
7
|
-
module RoutingHTTPMethodShim
|
8
|
-
def get(path, **args)
|
9
|
-
super(path, args[:params], args[:headers])
|
10
|
-
end
|
11
|
-
|
12
|
-
def post(path, **args)
|
13
|
-
super(path, args[:params], args[:headers])
|
14
|
-
end
|
15
|
-
|
16
|
-
def put(path, **args)
|
17
|
-
super(path, args[:params], args[:headers])
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
module ControllerHTTPMethodShim
|
22
|
-
def process(action, http_method = "GET", **args)
|
23
|
-
if (as = args.delete(:as))
|
24
|
-
@request.headers["Content-Type"] = Mime[as].to_s
|
25
|
-
end
|
26
|
-
|
27
|
-
super(action, http_method, args[:params], args[:session], args[:flash])
|
28
|
-
end
|
29
|
-
end
|
@@ -1,123 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
shared_context "valid token", token: :valid do
|
4
|
-
let(:token_string) { "1A2B3C4D" }
|
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) { "1A2B3C4D" }
|
21
|
-
|
22
|
-
let :token do
|
23
|
-
double(Doorkeeper::AccessToken,
|
24
|
-
accessible?: false, revoked?: false, expired?: false,
|
25
|
-
includes_scope?: false, acceptable?: false,
|
26
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true)
|
27
|
-
end
|
28
|
-
|
29
|
-
before :each do
|
30
|
-
allow(
|
31
|
-
Doorkeeper::AccessToken
|
32
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
shared_context "authenticated resource owner" do
|
37
|
-
before do
|
38
|
-
user = double(:resource, id: 1)
|
39
|
-
allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { user } }
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
shared_context "not authenticated resource owner" do
|
44
|
-
before do
|
45
|
-
allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { redirect_to "/" } }
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
shared_context "valid authorization request" do
|
50
|
-
let :authorization do
|
51
|
-
double(:authorization, valid?: true, authorize: true, success_redirect_uri: "http://something.com/cb?code=token")
|
52
|
-
end
|
53
|
-
|
54
|
-
before do
|
55
|
-
allow(controller).to receive(:authorization) { authorization }
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
shared_context "invalid authorization request" do
|
60
|
-
let :authorization do
|
61
|
-
double(:authorization, valid?: false, authorize: false, redirect_on_error?: false)
|
62
|
-
end
|
63
|
-
|
64
|
-
before do
|
65
|
-
allow(controller).to receive(:authorization) { authorization }
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
shared_context "expired token", token: :expired do
|
70
|
-
let :token_string do
|
71
|
-
"1A2B3C4DEXP"
|
72
|
-
end
|
73
|
-
|
74
|
-
let :token do
|
75
|
-
double(Doorkeeper::AccessToken,
|
76
|
-
accessible?: false, revoked?: false, expired?: true,
|
77
|
-
includes_scope?: false, acceptable?: false,
|
78
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true)
|
79
|
-
end
|
80
|
-
|
81
|
-
before :each do
|
82
|
-
allow(
|
83
|
-
Doorkeeper::AccessToken
|
84
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
shared_context "revoked token", token: :revoked do
|
89
|
-
let :token_string do
|
90
|
-
"1A2B3C4DREV"
|
91
|
-
end
|
92
|
-
|
93
|
-
let :token do
|
94
|
-
double(Doorkeeper::AccessToken,
|
95
|
-
accessible?: false, revoked?: true, expired?: false,
|
96
|
-
includes_scope?: false, acceptable?: false,
|
97
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true)
|
98
|
-
end
|
99
|
-
|
100
|
-
before :each do
|
101
|
-
allow(
|
102
|
-
Doorkeeper::AccessToken
|
103
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
shared_context "forbidden token", token: :forbidden do
|
108
|
-
let :token_string do
|
109
|
-
"1A2B3C4DFORB"
|
110
|
-
end
|
111
|
-
|
112
|
-
let :token do
|
113
|
-
double(Doorkeeper::AccessToken,
|
114
|
-
accessible?: true, includes_scope?: true, acceptable?: false,
|
115
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true)
|
116
|
-
end
|
117
|
-
|
118
|
-
before :each do
|
119
|
-
allow(
|
120
|
-
Doorkeeper::AccessToken
|
121
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
122
|
-
end
|
123
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
shared_context "with token hashing enabled" do
|
4
|
-
let(:hashed_or_plain_token_func) do
|
5
|
-
Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
|
6
|
-
end
|
7
|
-
|
8
|
-
before do
|
9
|
-
Doorkeeper.configure do
|
10
|
-
hash_token_secrets
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
shared_context "with token hashing and fallback lookup enabled" do
|
16
|
-
let(:hashed_or_plain_token_func) do
|
17
|
-
Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
|
18
|
-
end
|
19
|
-
|
20
|
-
before do
|
21
|
-
Doorkeeper.configure do
|
22
|
-
hash_token_secrets fallback: :plain
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
shared_context "with application hashing enabled" do
|
28
|
-
let(:hashed_or_plain_token_func) do
|
29
|
-
Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
|
30
|
-
end
|
31
|
-
before do
|
32
|
-
Doorkeeper.configure do
|
33
|
-
hash_application_secrets
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
shared_examples "an accessible token" do
|
4
|
-
describe :accessible? do
|
5
|
-
it "is accessible if token is not expired" do
|
6
|
-
allow(subject).to receive(:expired?).and_return(false)
|
7
|
-
should be_accessible
|
8
|
-
end
|
9
|
-
|
10
|
-
it "is not accessible if token is expired" do
|
11
|
-
allow(subject).to receive(:expired?).and_return(true)
|
12
|
-
should_not be_accessible
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
shared_examples "a revocable token" do
|
18
|
-
describe :accessible? do
|
19
|
-
before { subject.save! }
|
20
|
-
|
21
|
-
it "is accessible if token is not revoked" do
|
22
|
-
expect(subject).to be_accessible
|
23
|
-
end
|
24
|
-
|
25
|
-
it "is not accessible if token is revoked" do
|
26
|
-
subject.revoke
|
27
|
-
expect(subject).not_to be_accessible
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
shared_examples "a unique token" do
|
33
|
-
describe :token do
|
34
|
-
it "is generated before validation" do
|
35
|
-
expect { subject.valid? }.to change { subject.token }.from(nil)
|
36
|
-
end
|
37
|
-
|
38
|
-
it "is not valid if token exists" do
|
39
|
-
token1 = FactoryBot.create factory_name
|
40
|
-
token2 = FactoryBot.create factory_name
|
41
|
-
token2.token = token1.token
|
42
|
-
expect(token2).not_to be_valid
|
43
|
-
end
|
44
|
-
|
45
|
-
it "expects database to throw an error when tokens are the same" do
|
46
|
-
token1 = FactoryBot.create factory_name
|
47
|
-
token2 = FactoryBot.create factory_name
|
48
|
-
token2.token = token1.token
|
49
|
-
expect do
|
50
|
-
token2.save!(validate: false)
|
51
|
-
end.to raise_error(uniqueness_error)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,158 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe RedirectUriValidator do
|
6
|
-
subject do
|
7
|
-
FactoryBot.create(:application)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "is valid when the uri is a uri" do
|
11
|
-
subject.redirect_uri = "https://example.com/callback"
|
12
|
-
expect(subject).to be_valid
|
13
|
-
end
|
14
|
-
|
15
|
-
# Most mobile and desktop operating systems allow apps to register a custom URL
|
16
|
-
# scheme that will launch the app when a URL with that scheme is visited from
|
17
|
-
# the system browser.
|
18
|
-
#
|
19
|
-
# @see https://www.oauth.com/oauth2-servers/redirect-uris/redirect-uris-native-apps/
|
20
|
-
it "is valid when the uri is custom native URI" do
|
21
|
-
subject.redirect_uri = "myapp://callback"
|
22
|
-
expect(subject).to be_valid
|
23
|
-
end
|
24
|
-
|
25
|
-
it "is valid when the uri has a query parameter" do
|
26
|
-
subject.redirect_uri = "https://example.com/abcd?xyz=123"
|
27
|
-
expect(subject).to be_valid
|
28
|
-
end
|
29
|
-
|
30
|
-
it "accepts native redirect uri" do
|
31
|
-
subject.redirect_uri = "urn:ietf:wg:oauth:2.0:oob"
|
32
|
-
expect(subject).to be_valid
|
33
|
-
end
|
34
|
-
|
35
|
-
it "rejects if test uri is disabled" do
|
36
|
-
allow(RedirectUriValidator).to receive(:native_redirect_uri).and_return(nil)
|
37
|
-
subject.redirect_uri = "urn:some:test"
|
38
|
-
expect(subject).not_to be_valid
|
39
|
-
end
|
40
|
-
|
41
|
-
it "is invalid when the uri is not a uri" do
|
42
|
-
subject.redirect_uri = "]"
|
43
|
-
expect(subject).not_to be_valid
|
44
|
-
expect(subject.errors[:redirect_uri].first).to eq("must be a valid URI.")
|
45
|
-
end
|
46
|
-
|
47
|
-
it "is invalid when the uri is relative" do
|
48
|
-
subject.redirect_uri = "/abcd"
|
49
|
-
expect(subject).not_to be_valid
|
50
|
-
expect(subject.errors[:redirect_uri].first).to eq("must be an absolute URI.")
|
51
|
-
end
|
52
|
-
|
53
|
-
it "is invalid when the uri has a fragment" do
|
54
|
-
subject.redirect_uri = "https://example.com/abcd#xyz"
|
55
|
-
expect(subject).not_to be_valid
|
56
|
-
expect(subject.errors[:redirect_uri].first).to eq("cannot contain a fragment.")
|
57
|
-
end
|
58
|
-
|
59
|
-
context "force secured uri" do
|
60
|
-
it "accepts an valid uri" do
|
61
|
-
subject.redirect_uri = "https://example.com/callback"
|
62
|
-
expect(subject).to be_valid
|
63
|
-
end
|
64
|
-
|
65
|
-
it "accepts native redirect uri" do
|
66
|
-
subject.redirect_uri = "urn:ietf:wg:oauth:2.0:oob"
|
67
|
-
expect(subject).to be_valid
|
68
|
-
end
|
69
|
-
|
70
|
-
it "accepts app redirect uri" do
|
71
|
-
subject.redirect_uri = "some-awesome-app://oauth/callback"
|
72
|
-
expect(subject).to be_valid
|
73
|
-
end
|
74
|
-
|
75
|
-
it "accepts a non secured protocol when disabled" do
|
76
|
-
subject.redirect_uri = "http://example.com/callback"
|
77
|
-
allow(Doorkeeper.configuration).to receive(
|
78
|
-
:force_ssl_in_redirect_uri
|
79
|
-
).and_return(false)
|
80
|
-
expect(subject).to be_valid
|
81
|
-
end
|
82
|
-
|
83
|
-
it "accepts a non secured protocol when conditional option defined" do
|
84
|
-
Doorkeeper.configure do
|
85
|
-
orm DOORKEEPER_ORM
|
86
|
-
force_ssl_in_redirect_uri { |uri| uri.host != "localhost" }
|
87
|
-
end
|
88
|
-
|
89
|
-
application = FactoryBot.build(:application, redirect_uri: "http://localhost/callback")
|
90
|
-
expect(application).to be_valid
|
91
|
-
|
92
|
-
application = FactoryBot.build(:application, redirect_uri: "https://test.com/callback")
|
93
|
-
expect(application).to be_valid
|
94
|
-
|
95
|
-
application = FactoryBot.build(:application, redirect_uri: "http://localhost2/callback")
|
96
|
-
expect(application).not_to be_valid
|
97
|
-
|
98
|
-
application = FactoryBot.build(:application, redirect_uri: "https://test.com/callback")
|
99
|
-
expect(application).to be_valid
|
100
|
-
end
|
101
|
-
|
102
|
-
it "forbids redirect uri if required" do
|
103
|
-
subject.redirect_uri = "javascript://document.cookie"
|
104
|
-
|
105
|
-
Doorkeeper.configure do
|
106
|
-
orm DOORKEEPER_ORM
|
107
|
-
forbid_redirect_uri { |uri| uri.scheme == "javascript" }
|
108
|
-
end
|
109
|
-
|
110
|
-
expect(subject).to be_invalid
|
111
|
-
expect(subject.errors[:redirect_uri].first).to eq("is forbidden by the server.")
|
112
|
-
|
113
|
-
subject.redirect_uri = "https://localhost/callback"
|
114
|
-
expect(subject).to be_valid
|
115
|
-
end
|
116
|
-
|
117
|
-
it "invalidates the uri when the uri does not use a secure protocol" do
|
118
|
-
subject.redirect_uri = "http://example.com/callback"
|
119
|
-
expect(subject).not_to be_valid
|
120
|
-
error = subject.errors[:redirect_uri].first
|
121
|
-
expect(error).to eq("must be an HTTPS/SSL URI.")
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
context "multiple redirect uri" do
|
126
|
-
it "invalidates the second uri when the first uri is native uri" do
|
127
|
-
subject.redirect_uri = "urn:ietf:wg:oauth:2.0:oob\nexample.com/callback"
|
128
|
-
expect(subject).to be_invalid
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
context "blank redirect URI" do
|
133
|
-
it "forbids blank redirect uri by default" do
|
134
|
-
subject.redirect_uri = ""
|
135
|
-
|
136
|
-
expect(subject).to be_invalid
|
137
|
-
expect(subject.errors[:redirect_uri]).not_to be_blank
|
138
|
-
end
|
139
|
-
|
140
|
-
it "forbids blank redirect uri by custom condition" do
|
141
|
-
Doorkeeper.configure do
|
142
|
-
orm DOORKEEPER_ORM
|
143
|
-
allow_blank_redirect_uri do |_grant_flows, application|
|
144
|
-
application.name == "admin app"
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
subject.name = "test app"
|
149
|
-
subject.redirect_uri = ""
|
150
|
-
|
151
|
-
expect(subject).to be_invalid
|
152
|
-
expect(subject.errors[:redirect_uri]).not_to be_blank
|
153
|
-
|
154
|
-
subject.name = "admin app"
|
155
|
-
expect(subject).to be_valid
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe Doorkeeper::VERSION do
|
6
|
-
context "#gem_version" do
|
7
|
-
it "returns Gem::Version instance" do
|
8
|
-
expect(Doorkeeper.gem_version).to be_an_instance_of(Gem::Version)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
context "VERSION" do
|
13
|
-
it "returns gem version string" do
|
14
|
-
expect(Doorkeeper::VERSION::STRING).to match(/^\d+\.\d+\.\d+(\.\w+)?$/)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|