doorkeeper 5.2.2 → 5.5.4
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 +4 -4
- data/CHANGELOG.md +198 -3
- data/README.md +28 -20
- data/app/controllers/doorkeeper/application_controller.rb +3 -2
- data/app/controllers/doorkeeper/application_metal_controller.rb +2 -2
- data/app/controllers/doorkeeper/applications_controller.rb +7 -8
- data/app/controllers/doorkeeper/authorizations_controller.rb +48 -18
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +6 -6
- data/app/controllers/doorkeeper/token_info_controller.rb +12 -2
- data/app/controllers/doorkeeper/tokens_controller.rb +70 -25
- data/app/helpers/doorkeeper/dashboard_helper.rb +1 -1
- data/app/views/doorkeeper/applications/_form.html.erb +1 -1
- data/app/views/doorkeeper/applications/show.html.erb +35 -14
- data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
- data/app/views/doorkeeper/authorizations/new.html.erb +2 -0
- data/config/locales/en.yml +9 -2
- data/lib/doorkeeper/config/abstract_builder.rb +28 -0
- data/lib/doorkeeper/config/option.rb +26 -14
- data/lib/doorkeeper/config/validations.rb +53 -0
- data/lib/doorkeeper/config.rb +214 -122
- data/lib/doorkeeper/engine.rb +1 -1
- 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 +2 -2
- data/lib/doorkeeper/helpers/controller.rb +18 -12
- data/lib/doorkeeper/models/access_grant_mixin.rb +23 -19
- data/lib/doorkeeper/models/access_token_mixin.rb +157 -55
- data/lib/doorkeeper/models/application_mixin.rb +8 -7
- data/lib/doorkeeper/models/concerns/expirable.rb +1 -1
- data/lib/doorkeeper/models/concerns/ownership.rb +1 -1
- 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 +22 -9
- data/lib/doorkeeper/oauth/authorization/context.rb +5 -5
- data/lib/doorkeeper/oauth/authorization/token.rb +23 -18
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +4 -4
- data/lib/doorkeeper/oauth/authorization_code_request.rb +30 -20
- data/lib/doorkeeper/oauth/base_request.rb +19 -23
- 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 +38 -12
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +10 -8
- data/lib/doorkeeper/oauth/client_credentials/{validation.rb → validator.rb} +7 -5
- data/lib/doorkeeper/oauth/client_credentials_request.rb +8 -7
- data/lib/doorkeeper/oauth/code_request.rb +4 -4
- data/lib/doorkeeper/oauth/code_response.rb +24 -14
- data/lib/doorkeeper/oauth/error.rb +1 -1
- data/lib/doorkeeper/oauth/error_response.rb +10 -11
- 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 +1 -19
- data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
- data/lib/doorkeeper/oauth/invalid_request_response.rb +3 -3
- data/lib/doorkeeper/oauth/invalid_token_response.rb +7 -4
- data/lib/doorkeeper/oauth/password_access_token_request.rb +28 -10
- data/lib/doorkeeper/oauth/pre_authorization.rb +73 -37
- data/lib/doorkeeper/oauth/refresh_token_request.rb +35 -26
- data/lib/doorkeeper/oauth/token.rb +6 -7
- data/lib/doorkeeper/oauth/token_introspection.rb +12 -16
- data/lib/doorkeeper/oauth/token_request.rb +3 -3
- data/lib/doorkeeper/oauth/token_response.rb +1 -1
- 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 -95
- data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +69 -0
- data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +60 -0
- data/lib/doorkeeper/orm/active_record/mixins/application.rb +199 -0
- data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +8 -3
- data/lib/doorkeeper/orm/active_record.rb +5 -7
- 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 +17 -25
- data/lib/doorkeeper/rake/db.rake +6 -6
- data/lib/doorkeeper/rake/setup.rake +5 -0
- data/lib/doorkeeper/request/authorization_code.rb +3 -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 -12
- data/lib/doorkeeper/server.rb +5 -5
- data/lib/doorkeeper/stale_records_cleaner.rb +4 -4
- data/lib/doorkeeper/version.rb +2 -6
- data/lib/doorkeeper.rb +112 -81
- 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 +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 +2 -0
- data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
- data/lib/generators/doorkeeper/templates/initializer.rb +99 -14
- data/lib/generators/doorkeeper/templates/migration.rb.erb +14 -5
- metadata +37 -306
- data/Appraisals +0 -40
- data/CODE_OF_CONDUCT.md +0 -46
- data/CONTRIBUTING.md +0 -49
- data/Dangerfile +0 -67
- data/Dockerfile +0 -29
- data/Gemfile +0 -25
- data/NEWS.md +0 -1
- data/RELEASING.md +0 -11
- data/Rakefile +0 -28
- data/SECURITY.md +0 -15
- data/UPGRADE.md +0 -2
- data/bin/console +0 -16
- data/doorkeeper.gemspec +0 -42
- data/gemfiles/rails_5_0.gemfile +0 -18
- data/gemfiles/rails_5_1.gemfile +0 -18
- data/gemfiles/rails_5_2.gemfile +0 -18
- data/gemfiles/rails_6_0.gemfile +0 -18
- data/gemfiles/rails_master.gemfile +0 -18
- data/spec/controllers/application_metal_controller_spec.rb +0 -64
- data/spec/controllers/applications_controller_spec.rb +0 -273
- data/spec/controllers/authorizations_controller_spec.rb +0 -608
- 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 -498
- 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 -49
- 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 -166
- 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 -739
- 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 -168
- data/spec/lib/oauth/base_request_spec.rb +0 -222
- 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 -97
- 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 -46
- 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 -262
- data/spec/lib/oauth/invalid_request_response_spec.rb +0 -75
- 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 -225
- data/spec/lib/oauth/refresh_token_request_spec.rb +0 -178
- data/spec/lib/oauth/scopes_spec.rb +0 -148
- data/spec/lib/oauth/token_request_spec.rb +0 -153
- 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 -49
- data/spec/lib/stale_records_cleaner_spec.rb +0 -89
- data/spec/models/doorkeeper/access_grant_spec.rb +0 -163
- data/spec/models/doorkeeper/access_token_spec.rb +0 -622
- data/spec/models/doorkeeper/application_spec.rb +0 -377
- 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 -89
- data/spec/requests/endpoints/token_spec.rb +0 -75
- data/spec/requests/flows/authorization_code_errors_spec.rb +0 -79
- data/spec/requests/flows/authorization_code_spec.rb +0 -513
- data/spec/requests/flows/client_credentials_spec.rb +0 -166
- data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -46
- data/spec/requests/flows/implicit_grant_spec.rb +0 -91
- data/spec/requests/flows/password_spec.rb +0 -296
- data/spec/requests/flows/refresh_token_spec.rb +0 -233
- data/spec/requests/flows/revoke_token_spec.rb +0 -151
- 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 -110
- 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 -183
- data/spec/version/version_spec.rb +0 -17
data/spec/lib/doorkeeper_spec.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe Doorkeeper do
|
6
|
-
describe "#authenticate" do
|
7
|
-
let(:request) { double }
|
8
|
-
|
9
|
-
it "calls OAuth::Token#authenticate" do
|
10
|
-
token_strategies = Doorkeeper.configuration.access_token_methods
|
11
|
-
|
12
|
-
expect(Doorkeeper::OAuth::Token).to receive(:authenticate)
|
13
|
-
.with(request, *token_strategies)
|
14
|
-
|
15
|
-
Doorkeeper.authenticate(request)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "accepts custom token strategies" do
|
19
|
-
token_strategies = %i[first_way second_way]
|
20
|
-
|
21
|
-
expect(Doorkeeper::OAuth::Token).to receive(:authenticate)
|
22
|
-
.with(request, *token_strategies)
|
23
|
-
|
24
|
-
Doorkeeper.authenticate(request, token_strategies)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe "Expirable" do
|
6
|
-
subject do
|
7
|
-
Class.new do
|
8
|
-
include Doorkeeper::Models::Expirable
|
9
|
-
end.new
|
10
|
-
end
|
11
|
-
|
12
|
-
before do
|
13
|
-
allow(subject).to receive(:created_at).and_return(1.minute.ago)
|
14
|
-
end
|
15
|
-
|
16
|
-
describe :expired? do
|
17
|
-
it "is not expired if time has not passed" do
|
18
|
-
allow(subject).to receive(:expires_in).and_return(2.minutes)
|
19
|
-
expect(subject).not_to be_expired
|
20
|
-
end
|
21
|
-
|
22
|
-
it "is expired if time has passed" do
|
23
|
-
allow(subject).to receive(:expires_in).and_return(10.seconds)
|
24
|
-
expect(subject).to be_expired
|
25
|
-
end
|
26
|
-
|
27
|
-
it "is not expired if expires_in is not set" do
|
28
|
-
allow(subject).to receive(:expires_in).and_return(nil)
|
29
|
-
expect(subject).not_to be_expired
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe :expires_in_seconds do
|
34
|
-
it "should return the amount of time remaining until the token is expired" do
|
35
|
-
allow(subject).to receive(:expires_in).and_return(2.minutes)
|
36
|
-
expect(subject.expires_in_seconds).to eq(60)
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should return 0 when expired" do
|
40
|
-
allow(subject).to receive(:expires_in).and_return(30.seconds)
|
41
|
-
expect(subject.expires_in_seconds).to eq(0)
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should return nil when expires_in is nil" do
|
45
|
-
allow(subject).to receive(:expires_in).and_return(nil)
|
46
|
-
expect(subject.expires_in_seconds).to be_nil
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe :expires_at do
|
51
|
-
it "should return the expiration time of the token" do
|
52
|
-
allow(subject).to receive(:expires_in).and_return(2.minutes)
|
53
|
-
expect(subject.expires_at).to be_a(Time)
|
54
|
-
end
|
55
|
-
|
56
|
-
it "should return nil when expires_in is nil" do
|
57
|
-
allow(subject).to receive(:expires_in).and_return(nil)
|
58
|
-
expect(subject.expires_at).to be_nil
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe "Reusable" do
|
6
|
-
subject do
|
7
|
-
Class.new do
|
8
|
-
include Doorkeeper::Models::Reusable
|
9
|
-
end.new
|
10
|
-
end
|
11
|
-
|
12
|
-
describe :reusable? do
|
13
|
-
it "is reusable if its expires_in is nil" do
|
14
|
-
allow(subject).to receive(:expired?).and_return(false)
|
15
|
-
allow(subject).to receive(:expires_in).and_return(nil)
|
16
|
-
expect(subject).to be_reusable
|
17
|
-
end
|
18
|
-
|
19
|
-
it "is reusable if its expiry has crossed reusable limit" do
|
20
|
-
allow(subject).to receive(:expired?).and_return(false)
|
21
|
-
allow(Doorkeeper.configuration).to receive(:token_reuse_limit).and_return(90)
|
22
|
-
allow(subject).to receive(:expires_in).and_return(100.seconds)
|
23
|
-
allow(subject).to receive(:expires_in_seconds).and_return(20.seconds)
|
24
|
-
expect(subject).to be_reusable
|
25
|
-
end
|
26
|
-
|
27
|
-
it "is not reusable if its expiry has crossed reusable limit" do
|
28
|
-
allow(subject).to receive(:expired?).and_return(false)
|
29
|
-
allow(Doorkeeper.configuration).to receive(:token_reuse_limit).and_return(90)
|
30
|
-
allow(subject).to receive(:expires_in).and_return(100.seconds)
|
31
|
-
allow(subject).to receive(:expires_in_seconds).and_return(5.seconds)
|
32
|
-
expect(subject).not_to be_reusable
|
33
|
-
end
|
34
|
-
|
35
|
-
it "is not reusable if it is already expired" do
|
36
|
-
allow(subject).to receive(:expired?).and_return(true)
|
37
|
-
expect(subject).not_to be_reusable
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe "Revocable" do
|
6
|
-
subject do
|
7
|
-
Class.new do
|
8
|
-
include Doorkeeper::Models::Revocable
|
9
|
-
end.new
|
10
|
-
end
|
11
|
-
|
12
|
-
describe :revoke do
|
13
|
-
it "updates :revoked_at attribute with current time" do
|
14
|
-
utc = double utc: double
|
15
|
-
clock = double now: utc
|
16
|
-
expect(subject).to receive(:update_attribute).with(:revoked_at, clock.now.utc)
|
17
|
-
subject.revoke(clock)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe :revoked? do
|
22
|
-
it "is revoked if :revoked_at has passed" do
|
23
|
-
allow(subject).to receive(:revoked_at).and_return(Time.now.utc - 1000)
|
24
|
-
expect(subject).to be_revoked
|
25
|
-
end
|
26
|
-
|
27
|
-
it "is not revoked if :revoked_at has not passed" do
|
28
|
-
allow(subject).to receive(:revoked_at).and_return(Time.now.utc + 1000)
|
29
|
-
expect(subject).not_to be_revoked
|
30
|
-
end
|
31
|
-
|
32
|
-
it "is not revoked if :revoked_at is not set" do
|
33
|
-
allow(subject).to receive(:revoked_at).and_return(nil)
|
34
|
-
expect(subject).not_to be_revoked
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe :revoke_previous_refresh_token! do
|
39
|
-
it "revokes the previous token if existing, and resets the
|
40
|
-
`previous_refresh_token` attribute" do
|
41
|
-
previous_token = FactoryBot.create(
|
42
|
-
:access_token,
|
43
|
-
refresh_token: "refresh_token"
|
44
|
-
)
|
45
|
-
current_token = FactoryBot.create(
|
46
|
-
:access_token,
|
47
|
-
previous_refresh_token: previous_token.refresh_token
|
48
|
-
)
|
49
|
-
|
50
|
-
expect_any_instance_of(
|
51
|
-
Doorkeeper::AccessToken
|
52
|
-
).to receive(:revoke).and_call_original
|
53
|
-
current_token.revoke_previous_refresh_token!
|
54
|
-
|
55
|
-
expect(current_token.previous_refresh_token).to be_empty
|
56
|
-
expect(previous_token.reload).to be_revoked
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe "Doorkeeper::Models::Scopes" do
|
6
|
-
subject do
|
7
|
-
Class.new(Struct.new(:scopes)) do
|
8
|
-
include Doorkeeper::Models::Scopes
|
9
|
-
end.new
|
10
|
-
end
|
11
|
-
|
12
|
-
before do
|
13
|
-
subject[:scopes] = "public admin"
|
14
|
-
end
|
15
|
-
|
16
|
-
describe :scopes do
|
17
|
-
it "is a `Scopes` class" do
|
18
|
-
expect(subject.scopes).to be_a(Doorkeeper::OAuth::Scopes)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "includes scopes" do
|
22
|
-
expect(subject.scopes).to include("public")
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe :scopes= do
|
27
|
-
it "accepts String" do
|
28
|
-
subject.scopes = "private admin"
|
29
|
-
expect(subject.scopes_string).to eq("private admin")
|
30
|
-
end
|
31
|
-
|
32
|
-
it "accepts Array" do
|
33
|
-
subject.scopes = %w[private admin]
|
34
|
-
expect(subject.scopes_string).to eq("private admin")
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe :scopes_string do
|
39
|
-
it "is a `Scopes` class" do
|
40
|
-
expect(subject.scopes_string).to eq("public admin")
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe :includes_scope? do
|
45
|
-
it "should return true if at least one scope is included" do
|
46
|
-
expect(subject.includes_scope?("public", "private")).to be true
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should return false if no scopes are included" do
|
50
|
-
expect(subject.includes_scope?("teacher", "student")).to be false
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,135 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
describe "SecretStorable" do
|
6
|
-
let(:clazz) do
|
7
|
-
Class.new do
|
8
|
-
include Doorkeeper::Models::SecretStorable
|
9
|
-
|
10
|
-
def self.find_by(*)
|
11
|
-
raise "stub this"
|
12
|
-
end
|
13
|
-
|
14
|
-
def update_column(*)
|
15
|
-
raise "stub this"
|
16
|
-
end
|
17
|
-
|
18
|
-
def token
|
19
|
-
raise "stub this"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
let(:strategy) { clazz.secret_strategy }
|
24
|
-
|
25
|
-
describe :find_by_plaintext_token do
|
26
|
-
subject { clazz.send(:find_by_plaintext_token, "attr", "input") }
|
27
|
-
|
28
|
-
it "forwards to the secret_strategy" do
|
29
|
-
expect(strategy)
|
30
|
-
.to receive(:transform_secret)
|
31
|
-
.with("input")
|
32
|
-
.and_return "found"
|
33
|
-
|
34
|
-
expect(clazz)
|
35
|
-
.to receive(:find_by)
|
36
|
-
.with("attr" => "found")
|
37
|
-
.and_return "result"
|
38
|
-
|
39
|
-
expect(subject).to eq "result"
|
40
|
-
end
|
41
|
-
|
42
|
-
it "calls find_by_fallback_token if not found" do
|
43
|
-
expect(clazz)
|
44
|
-
.to receive(:find_by)
|
45
|
-
.with("attr" => "input")
|
46
|
-
.and_return nil
|
47
|
-
|
48
|
-
expect(clazz)
|
49
|
-
.to receive(:find_by_fallback_token)
|
50
|
-
.with("attr", "input")
|
51
|
-
.and_return "fallback"
|
52
|
-
|
53
|
-
expect(subject).to eq "fallback"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe :find_by_fallback_token do
|
58
|
-
subject { clazz.send(:find_by_fallback_token, "attr", "input") }
|
59
|
-
let(:fallback) { double(::Doorkeeper::SecretStoring::Plain) }
|
60
|
-
|
61
|
-
it "returns nil if none defined" do
|
62
|
-
expect(clazz.fallback_secret_strategy).to eq nil
|
63
|
-
expect(subject).to eq nil
|
64
|
-
end
|
65
|
-
|
66
|
-
context "if a fallback strategy is defined" do
|
67
|
-
before do
|
68
|
-
allow(clazz).to receive(:fallback_secret_strategy).and_return(fallback)
|
69
|
-
end
|
70
|
-
|
71
|
-
context "if a resource is defined" do
|
72
|
-
let(:resource) { double("Token model") }
|
73
|
-
|
74
|
-
it "calls the strategy for lookup" do
|
75
|
-
expect(clazz)
|
76
|
-
.to receive(:find_by)
|
77
|
-
.with("attr" => "fallback")
|
78
|
-
.and_return(resource)
|
79
|
-
|
80
|
-
expect(fallback)
|
81
|
-
.to receive(:transform_secret)
|
82
|
-
.with("input")
|
83
|
-
.and_return("fallback")
|
84
|
-
|
85
|
-
# store_secret will call the resource
|
86
|
-
expect(resource)
|
87
|
-
.to receive(:attr=)
|
88
|
-
.with("new value")
|
89
|
-
|
90
|
-
# It will upgrade the secret automtically using the current strategy
|
91
|
-
expect(strategy)
|
92
|
-
.to receive(:transform_secret)
|
93
|
-
.with("input")
|
94
|
-
.and_return("new value")
|
95
|
-
|
96
|
-
expect(resource).to receive(:update).with("attr" => "new value")
|
97
|
-
expect(subject).to eq resource
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
context "if a resource is not defined" do
|
102
|
-
before do
|
103
|
-
allow(clazz).to receive(:fallback_secret_strategy).and_return(fallback)
|
104
|
-
end
|
105
|
-
|
106
|
-
it "returns nil" do
|
107
|
-
expect(clazz)
|
108
|
-
.to receive(:find_by)
|
109
|
-
.with("attr" => "fallback")
|
110
|
-
.and_return(nil)
|
111
|
-
|
112
|
-
expect(fallback)
|
113
|
-
.to receive(:transform_secret)
|
114
|
-
.with("input")
|
115
|
-
.and_return("fallback")
|
116
|
-
|
117
|
-
# It does not find a token even with the fallback method
|
118
|
-
expect(subject).to be_nil
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
describe :secret_strategy do
|
125
|
-
it "defaults to plain strategy" do
|
126
|
-
expect(strategy).to eq Doorkeeper::SecretStoring::Plain
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
describe :fallback_secret_strategy do
|
131
|
-
it "defaults to nil" do
|
132
|
-
expect(clazz.fallback_secret_strategy).to eq nil
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
module Doorkeeper::OAuth::Authorization
|
6
|
-
describe URIBuilder do
|
7
|
-
subject { URIBuilder }
|
8
|
-
|
9
|
-
describe :uri_with_query do
|
10
|
-
it "returns the uri with query" do
|
11
|
-
uri = subject.uri_with_query "http://example.com/", parameter: "value"
|
12
|
-
expect(uri).to eq("http://example.com/?parameter=value")
|
13
|
-
end
|
14
|
-
|
15
|
-
it "rejects nil values" do
|
16
|
-
uri = subject.uri_with_query "http://example.com/", parameter: ""
|
17
|
-
expect(uri).to eq("http://example.com/?")
|
18
|
-
end
|
19
|
-
|
20
|
-
it "preserves original query parameters" do
|
21
|
-
uri = subject.uri_with_query "http://example.com/?query1=value", parameter: "value"
|
22
|
-
expect(uri).to match(/query1=value/)
|
23
|
-
expect(uri).to match(/parameter=value/)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe :uri_with_fragment do
|
28
|
-
it "returns uri with parameters as fragments" do
|
29
|
-
uri = subject.uri_with_fragment "http://example.com/", parameter: "value"
|
30
|
-
expect(uri).to eq("http://example.com/#parameter=value")
|
31
|
-
end
|
32
|
-
|
33
|
-
it "preserves original query parameters" do
|
34
|
-
uri = subject.uri_with_fragment "http://example.com/?query1=value1", parameter: "value"
|
35
|
-
expect(uri).to eq("http://example.com/?query1=value1#parameter=value")
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,168 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "spec_helper"
|
4
|
-
|
5
|
-
module Doorkeeper::OAuth
|
6
|
-
describe AuthorizationCodeRequest do
|
7
|
-
let(:server) do
|
8
|
-
double :server,
|
9
|
-
access_token_expires_in: 2.days,
|
10
|
-
refresh_token_enabled?: false,
|
11
|
-
custom_access_token_expires_in: lambda { |context|
|
12
|
-
context.grant_type == Doorkeeper::OAuth::AUTHORIZATION_CODE ? 1234 : nil
|
13
|
-
}
|
14
|
-
end
|
15
|
-
|
16
|
-
let(:grant) { FactoryBot.create :access_grant }
|
17
|
-
let(:client) { grant.application }
|
18
|
-
let(:redirect_uri) { client.redirect_uri }
|
19
|
-
let(:params) { { redirect_uri: redirect_uri } }
|
20
|
-
|
21
|
-
before do
|
22
|
-
allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
|
23
|
-
end
|
24
|
-
|
25
|
-
subject do
|
26
|
-
AuthorizationCodeRequest.new(server, grant, client, params)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "issues a new token for the client" do
|
30
|
-
expect do
|
31
|
-
subject.authorize
|
32
|
-
end.to change { client.reload.access_tokens.count }.by(1)
|
33
|
-
|
34
|
-
expect(client.reload.access_tokens.max_by(&:created_at).expires_in).to eq(1234)
|
35
|
-
end
|
36
|
-
|
37
|
-
it "issues the token with same grant's scopes" do
|
38
|
-
subject.authorize
|
39
|
-
expect(Doorkeeper::AccessToken.last.scopes).to eq(grant.scopes)
|
40
|
-
end
|
41
|
-
|
42
|
-
it "revokes the grant" do
|
43
|
-
expect { subject.authorize }.to(change { grant.reload.accessible? })
|
44
|
-
end
|
45
|
-
|
46
|
-
it "requires the grant to be accessible" do
|
47
|
-
grant.revoke
|
48
|
-
subject.validate
|
49
|
-
expect(subject.error).to eq(:invalid_grant)
|
50
|
-
end
|
51
|
-
|
52
|
-
it "requires the grant" do
|
53
|
-
subject.grant = nil
|
54
|
-
subject.validate
|
55
|
-
expect(subject.error).to eq(:invalid_grant)
|
56
|
-
end
|
57
|
-
|
58
|
-
it "requires the client" do
|
59
|
-
subject.client = nil
|
60
|
-
subject.validate
|
61
|
-
expect(subject.error).to eq(:invalid_client)
|
62
|
-
end
|
63
|
-
|
64
|
-
it "requires the redirect_uri" do
|
65
|
-
subject.redirect_uri = nil
|
66
|
-
subject.validate
|
67
|
-
expect(subject.error).to eq(:invalid_request)
|
68
|
-
expect(subject.missing_param).to eq(:redirect_uri)
|
69
|
-
end
|
70
|
-
|
71
|
-
it "invalid code_verifier param because server does not support pkce" do
|
72
|
-
# Some other ORMs work relies on #respond_to? so it's not a good idea to stub it :\
|
73
|
-
allow_any_instance_of(Doorkeeper::AccessGrant).to receive(:respond_to?).with(anything).and_call_original
|
74
|
-
allow_any_instance_of(Doorkeeper::AccessGrant).to receive(:respond_to?).with(:code_challenge).and_return(false)
|
75
|
-
|
76
|
-
subject.code_verifier = "a45a9fea-0676-477e-95b1-a40f72ac3cfb"
|
77
|
-
subject.validate
|
78
|
-
expect(subject.error).to eq(:invalid_request)
|
79
|
-
expect(subject.invalid_request_reason).to eq(:not_support_pkce)
|
80
|
-
end
|
81
|
-
|
82
|
-
it "matches the redirect_uri with grant's one" do
|
83
|
-
subject.redirect_uri = "http://other.com"
|
84
|
-
subject.validate
|
85
|
-
expect(subject.error).to eq(:invalid_grant)
|
86
|
-
end
|
87
|
-
|
88
|
-
it "matches the client with grant's one" do
|
89
|
-
subject.client = FactoryBot.create :application
|
90
|
-
subject.validate
|
91
|
-
expect(subject.error).to eq(:invalid_grant)
|
92
|
-
end
|
93
|
-
|
94
|
-
it "skips token creation if there is a matching one reusable" do
|
95
|
-
scopes = grant.scopes
|
96
|
-
|
97
|
-
Doorkeeper.configure do
|
98
|
-
orm DOORKEEPER_ORM
|
99
|
-
reuse_access_token
|
100
|
-
default_scopes(*scopes)
|
101
|
-
end
|
102
|
-
|
103
|
-
FactoryBot.create(:access_token, application_id: client.id,
|
104
|
-
resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s)
|
105
|
-
|
106
|
-
expect { subject.authorize }.to_not(change { Doorkeeper::AccessToken.count })
|
107
|
-
end
|
108
|
-
|
109
|
-
it "creates token if there is a matching one but non reusable" do
|
110
|
-
scopes = grant.scopes
|
111
|
-
|
112
|
-
Doorkeeper.configure do
|
113
|
-
orm DOORKEEPER_ORM
|
114
|
-
reuse_access_token
|
115
|
-
default_scopes(*scopes)
|
116
|
-
end
|
117
|
-
|
118
|
-
FactoryBot.create(:access_token, application_id: client.id,
|
119
|
-
resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s)
|
120
|
-
|
121
|
-
allow_any_instance_of(Doorkeeper::AccessToken).to receive(:reusable?).and_return(false)
|
122
|
-
|
123
|
-
expect { subject.authorize }.to change { Doorkeeper::AccessToken.count }.by(1)
|
124
|
-
end
|
125
|
-
|
126
|
-
it "calls configured request callback methods" do
|
127
|
-
expect(Doorkeeper.configuration.before_successful_strategy_response)
|
128
|
-
.to receive(:call).with(subject).once
|
129
|
-
expect(Doorkeeper.configuration.after_successful_strategy_response)
|
130
|
-
.to receive(:call).with(subject, instance_of(Doorkeeper::OAuth::TokenResponse)).once
|
131
|
-
|
132
|
-
subject.authorize
|
133
|
-
end
|
134
|
-
|
135
|
-
context "when redirect_uri contains some query params" do
|
136
|
-
let(:redirect_uri) { client.redirect_uri + "?query=q" }
|
137
|
-
|
138
|
-
it "compares only host part with grant's redirect_uri" do
|
139
|
-
subject.validate
|
140
|
-
expect(subject.error).to eq(nil)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
context "when redirect_uri is not an URI" do
|
145
|
-
let(:redirect_uri) { "123d#!s" }
|
146
|
-
|
147
|
-
it "responds with invalid_grant" do
|
148
|
-
subject.validate
|
149
|
-
expect(subject.error).to eq(:invalid_grant)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
context "when redirect_uri is the native one" do
|
154
|
-
let(:redirect_uri) { "urn:ietf:wg:oauth:2.0:oob" }
|
155
|
-
|
156
|
-
it "invalidates when redirect_uri of the grant is not native" do
|
157
|
-
subject.validate
|
158
|
-
expect(subject.error).to eq(:invalid_grant)
|
159
|
-
end
|
160
|
-
|
161
|
-
it "validates when redirect_uri of the grant is also native" do
|
162
|
-
allow(grant).to receive(:redirect_uri) { redirect_uri }
|
163
|
-
subject.validate
|
164
|
-
expect(subject.error).to eq(nil)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|