doorkeeper 5.4.0.rc1 → 5.4.0
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/CHANGELOG.md +54 -1
- data/app/controllers/doorkeeper/applications_controller.rb +3 -3
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +1 -1
- data/app/views/doorkeeper/applications/_form.html.erb +1 -1
- data/lib/doorkeeper/config/abstract_builder.rb +1 -1
- data/lib/doorkeeper/config.rb +24 -18
- data/lib/doorkeeper/engine.rb +1 -1
- data/lib/doorkeeper/helpers/controller.rb +4 -4
- data/lib/doorkeeper/models/access_grant_mixin.rb +11 -5
- data/lib/doorkeeper/models/access_token_mixin.rb +9 -5
- data/lib/doorkeeper/models/application_mixin.rb +5 -4
- data/lib/doorkeeper/oauth/authorization/code.rb +1 -1
- data/lib/doorkeeper/oauth/authorization/token.rb +1 -1
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +2 -2
- data/lib/doorkeeper/oauth/client_credentials/validator.rb +3 -1
- data/lib/doorkeeper/oauth/code_request.rb +2 -2
- data/lib/doorkeeper/oauth/password_access_token_request.rb +1 -1
- data/lib/doorkeeper/oauth/pre_authorization.rb +5 -4
- data/lib/doorkeeper/oauth/token.rb +4 -5
- data/lib/doorkeeper/oauth/token_introspection.rb +1 -5
- data/lib/doorkeeper/oauth/token_request.rb +1 -1
- data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +1 -1
- data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +1 -1
- data/lib/doorkeeper/orm/active_record/mixins/application.rb +64 -9
- data/lib/doorkeeper/orm/active_record.rb +10 -2
- data/lib/doorkeeper/request/refresh_token.rb +2 -1
- data/lib/doorkeeper/server.rb +1 -1
- data/lib/doorkeeper/stale_records_cleaner.rb +4 -4
- data/lib/doorkeeper/version.rb +1 -1
- data/lib/doorkeeper.rb +1 -1
- data/lib/generators/doorkeeper/templates/migration.rb.erb +12 -5
- metadata +7 -301
- data/Appraisals +0 -26
- 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 -30
- data/doorkeeper.gemspec +0 -42
- data/gemfiles/rails_5_0.gemfile +0 -19
- data/gemfiles/rails_5_1.gemfile +0 -19
- data/gemfiles/rails_5_2.gemfile +0 -19
- data/gemfiles/rails_6_0.gemfile +0 -19
- data/gemfiles/rails_master.gemfile +0 -19
- data/spec/controllers/application_metal_controller_spec.rb +0 -64
- data/spec/controllers/applications_controller_spec.rb +0 -274
- data/spec/controllers/authorizations_controller_spec.rb +0 -743
- data/spec/controllers/protected_resources_controller_spec.rb +0 -361
- data/spec/controllers/token_info_controller_spec.rb +0 -50
- data/spec/controllers/tokens_controller_spec.rb +0 -499
- 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 -11
- 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 -51
- 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 -70
- 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/enable_polymorphic_resource_owner_generator_spec.rb +0 -47
- 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 -813
- 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 -58
- data/spec/lib/models/scopes_spec.rb +0 -61
- 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 -180
- data/spec/lib/oauth/base_request_spec.rb +0 -210
- data/spec/lib/oauth/base_response_spec.rb +0 -45
- data/spec/lib/oauth/client/credentials_spec.rb +0 -90
- data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -135
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -110
- data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -57
- data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
- data/spec/lib/oauth/client_credentials_request_spec.rb +0 -108
- 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 -64
- data/spec/lib/oauth/error_spec.rb +0 -21
- data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -20
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -110
- 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 -73
- data/spec/lib/oauth/invalid_token_response_spec.rb +0 -53
- data/spec/lib/oauth/password_access_token_request_spec.rb +0 -201
- data/spec/lib/oauth/pre_authorization_spec.rb +0 -218
- data/spec/lib/oauth/refresh_token_request_spec.rb +0 -166
- data/spec/lib/oauth/scopes_spec.rb +0 -146
- data/spec/lib/oauth/token_request_spec.rb +0 -164
- data/spec/lib/oauth/token_response_spec.rb +0 -84
- data/spec/lib/oauth/token_spec.rb +0 -156
- data/spec/lib/option_spec.rb +0 -51
- 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 -102
- data/spec/models/doorkeeper/access_grant_spec.rb +0 -175
- data/spec/models/doorkeeper/access_token_spec.rb +0 -650
- data/spec/models/doorkeeper/application_spec.rb +0 -442
- 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 -91
- data/spec/requests/endpoints/token_spec.rb +0 -79
- data/spec/requests/flows/authorization_code_errors_spec.rb +0 -82
- data/spec/requests/flows/authorization_code_spec.rb +0 -530
- data/spec/requests/flows/client_credentials_spec.rb +0 -207
- 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 -316
- data/spec/requests/flows/refresh_token_spec.rb +0 -241
- data/spec/requests/flows/revoke_token_spec.rb +0 -196
- 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 -54
- 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 -14
- 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/orm/active_record.rb +0 -5
- data/spec/support/shared/controllers_shared_context.rb +0 -133
- data/spec/support/shared/hashing_shared_context.rb +0 -36
- data/spec/support/shared/models_shared_examples.rb +0 -56
- data/spec/validators/redirect_uri_validator_spec.rb +0 -183
- data/spec/version/version_spec.rb +0 -17
|
@@ -1,133 +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(
|
|
8
|
-
Doorkeeper::AccessToken,
|
|
9
|
-
accessible?: true, includes_scope?: true, acceptable?: true,
|
|
10
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true,
|
|
11
|
-
)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
before :each do
|
|
15
|
-
allow(
|
|
16
|
-
Doorkeeper::AccessToken,
|
|
17
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
shared_context "invalid token", token: :invalid do
|
|
22
|
-
let(:token_string) { "1A2B3C4D" }
|
|
23
|
-
|
|
24
|
-
let :token do
|
|
25
|
-
double(
|
|
26
|
-
Doorkeeper::AccessToken,
|
|
27
|
-
accessible?: false, revoked?: false, expired?: false,
|
|
28
|
-
includes_scope?: false, acceptable?: false,
|
|
29
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true,
|
|
30
|
-
)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
before :each do
|
|
34
|
-
allow(
|
|
35
|
-
Doorkeeper::AccessToken,
|
|
36
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
shared_context "authenticated resource owner" do
|
|
41
|
-
before do
|
|
42
|
-
user = double(:resource, id: 1)
|
|
43
|
-
allow(Doorkeeper.config).to receive(:authenticate_resource_owner) { proc { user } }
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
shared_context "not authenticated resource owner" do
|
|
48
|
-
before do
|
|
49
|
-
allow(Doorkeeper.config).to receive(:authenticate_resource_owner) { proc { redirect_to "/" } }
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
shared_context "valid authorization request" do
|
|
54
|
-
let :authorization do
|
|
55
|
-
double(:authorization, valid?: true, authorize: true, success_redirect_uri: "http://something.com/cb?code=token")
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
before do
|
|
59
|
-
allow(controller).to receive(:authorization) { authorization }
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
shared_context "invalid authorization request" do
|
|
64
|
-
let :authorization do
|
|
65
|
-
double(:authorization, valid?: false, authorize: false, redirect_on_error?: false)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
before do
|
|
69
|
-
allow(controller).to receive(:authorization) { authorization }
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
shared_context "expired token", token: :expired do
|
|
74
|
-
let :token_string do
|
|
75
|
-
"1A2B3C4DEXP"
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
let :token do
|
|
79
|
-
double(
|
|
80
|
-
Doorkeeper::AccessToken,
|
|
81
|
-
accessible?: false, revoked?: false, expired?: true,
|
|
82
|
-
includes_scope?: false, acceptable?: false,
|
|
83
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true,
|
|
84
|
-
)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
before :each do
|
|
88
|
-
allow(
|
|
89
|
-
Doorkeeper::AccessToken,
|
|
90
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
shared_context "revoked token", token: :revoked do
|
|
95
|
-
let :token_string do
|
|
96
|
-
"1A2B3C4DREV"
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
let :token do
|
|
100
|
-
double(
|
|
101
|
-
Doorkeeper::AccessToken,
|
|
102
|
-
accessible?: false, revoked?: true, expired?: false,
|
|
103
|
-
includes_scope?: false, acceptable?: false,
|
|
104
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true,
|
|
105
|
-
)
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
before :each do
|
|
109
|
-
allow(
|
|
110
|
-
Doorkeeper::AccessToken,
|
|
111
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
shared_context "forbidden token", token: :forbidden do
|
|
116
|
-
let :token_string do
|
|
117
|
-
"1A2B3C4DFORB"
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
let :token do
|
|
121
|
-
double(
|
|
122
|
-
Doorkeeper::AccessToken,
|
|
123
|
-
accessible?: true, includes_scope?: true, acceptable?: false,
|
|
124
|
-
previous_refresh_token: "", revoke_previous_refresh_token!: true,
|
|
125
|
-
)
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
before :each do
|
|
129
|
-
allow(
|
|
130
|
-
Doorkeeper::AccessToken,
|
|
131
|
-
).to receive(:by_token).with(token_string).and_return(token)
|
|
132
|
-
end
|
|
133
|
-
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,56 +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
|
-
let(:owner) { FactoryBot.create(:resource_owner) }
|
|
35
|
-
|
|
36
|
-
it "is generated before validation" do
|
|
37
|
-
expect { subject.valid? }.to change { subject.token }.from(nil)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "is not valid if token exists" do
|
|
41
|
-
token1 = FactoryBot.create factory_name, resource_owner_id: owner.id, resource_owner_type: owner.class.name
|
|
42
|
-
token2 = FactoryBot.create factory_name, resource_owner_id: owner.id, resource_owner_type: owner.class.name
|
|
43
|
-
token2.token = token1.token
|
|
44
|
-
expect(token2).not_to be_valid
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "expects database to throw an error when tokens are the same" do
|
|
48
|
-
token1 = FactoryBot.create factory_name, resource_owner_id: owner.id, resource_owner_type: owner.class.name
|
|
49
|
-
token2 = FactoryBot.create factory_name, resource_owner_id: owner.id, resource_owner_type: owner.class.name
|
|
50
|
-
token2.token = token1.token
|
|
51
|
-
expect do
|
|
52
|
-
token2.save!(validate: false)
|
|
53
|
-
end.to raise_error(uniqueness_error)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "spec_helper"
|
|
4
|
-
|
|
5
|
-
describe Doorkeeper::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 nonstandard oob 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 "accepts nonstandard oob:auto redirect uri" do
|
|
36
|
-
subject.redirect_uri = "urn:ietf:wg:oauth:2.0:oob:auto"
|
|
37
|
-
expect(subject).to be_valid
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "is invalid when the uri is not a uri" do
|
|
41
|
-
subject.redirect_uri = "]"
|
|
42
|
-
expect(subject).not_to be_valid
|
|
43
|
-
expect(subject.errors[:redirect_uri].first).to eq(I18n.t("activerecord.errors.models.doorkeeper/application.attributes.redirect_uri.invalid_uri"))
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
it "is invalid when the uri is relative" do
|
|
47
|
-
subject.redirect_uri = "/abcd"
|
|
48
|
-
expect(subject).not_to be_valid
|
|
49
|
-
expect(subject.errors[:redirect_uri].first).to eq(I18n.t("activerecord.errors.models.doorkeeper/application.attributes.redirect_uri.relative_uri"))
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "is invalid when the uri has a fragment" do
|
|
53
|
-
subject.redirect_uri = "https://example.com/abcd#xyz"
|
|
54
|
-
expect(subject).not_to be_valid
|
|
55
|
-
expect(subject.errors[:redirect_uri].first).to eq(I18n.t("activerecord.errors.models.doorkeeper/application.attributes.redirect_uri.fragment_present"))
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "is invalid when scheme resolves to localhost (needs an explict scheme)" do
|
|
59
|
-
subject.redirect_uri = "localhost:80"
|
|
60
|
-
expect(subject).to be_invalid
|
|
61
|
-
expect(subject.errors[:redirect_uri].first).to eq(I18n.t("activerecord.errors.models.doorkeeper/application.attributes.redirect_uri.unspecified_scheme"))
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
it "is invalid if an ip address" do
|
|
65
|
-
subject.redirect_uri = "127.0.0.1:8080"
|
|
66
|
-
expect(subject).to be_invalid
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it "accepts an ip address based URI if a scheme is specified" do
|
|
70
|
-
subject.redirect_uri = "https://127.0.0.1:8080"
|
|
71
|
-
expect(subject).to be_valid
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
context "force secured uri" do
|
|
75
|
-
it "accepts an valid uri" do
|
|
76
|
-
subject.redirect_uri = "https://example.com/callback"
|
|
77
|
-
expect(subject).to be_valid
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "accepts custom scheme redirect uri (as per rfc8252 section 7.1)" do
|
|
81
|
-
subject.redirect_uri = "com.example.app:/oauth/callback"
|
|
82
|
-
expect(subject).to be_valid
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
it "accepts custom scheme redirect uri (as per rfc8252 section 7.1) #2" do
|
|
86
|
-
subject.redirect_uri = "com.example.app:/test"
|
|
87
|
-
expect(subject).to be_valid
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
it "accepts custom scheme redirect uri (common misconfiguration we have decided to allow)" do
|
|
91
|
-
subject.redirect_uri = "com.example.app://oauth/callback"
|
|
92
|
-
expect(subject).to be_valid
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
it "accepts custom scheme redirect uri (common misconfiguration we have decided to allow) #2" do
|
|
96
|
-
subject.redirect_uri = "com.example.app://test"
|
|
97
|
-
expect(subject).to be_valid
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
it "accepts a non secured protocol when disabled" do
|
|
101
|
-
subject.redirect_uri = "http://example.com/callback"
|
|
102
|
-
allow(Doorkeeper.configuration).to receive(
|
|
103
|
-
:force_ssl_in_redirect_uri,
|
|
104
|
-
).and_return(false)
|
|
105
|
-
expect(subject).to be_valid
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
it "accepts a non secured protocol when conditional option defined" do
|
|
109
|
-
Doorkeeper.configure do
|
|
110
|
-
orm DOORKEEPER_ORM
|
|
111
|
-
force_ssl_in_redirect_uri { |uri| uri.host != "localhost" }
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
application = FactoryBot.build(:application, redirect_uri: "http://localhost/callback")
|
|
115
|
-
expect(application).to be_valid
|
|
116
|
-
|
|
117
|
-
application = FactoryBot.build(:application, redirect_uri: "https://test.com/callback")
|
|
118
|
-
expect(application).to be_valid
|
|
119
|
-
|
|
120
|
-
application = FactoryBot.build(:application, redirect_uri: "http://localhost2/callback")
|
|
121
|
-
expect(application).not_to be_valid
|
|
122
|
-
|
|
123
|
-
application = FactoryBot.build(:application, redirect_uri: "https://test.com/callback")
|
|
124
|
-
expect(application).to be_valid
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
it "forbids redirect uri if required" do
|
|
128
|
-
subject.redirect_uri = "javascript://document.cookie"
|
|
129
|
-
|
|
130
|
-
Doorkeeper.configure do
|
|
131
|
-
orm DOORKEEPER_ORM
|
|
132
|
-
forbid_redirect_uri { |uri| uri.scheme == "javascript" }
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
expect(subject).to be_invalid
|
|
136
|
-
expect(subject.errors[:redirect_uri].first).to eq("is forbidden by the server.")
|
|
137
|
-
|
|
138
|
-
subject.redirect_uri = "https://localhost/callback"
|
|
139
|
-
expect(subject).to be_valid
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
it "invalidates the uri when the uri does not use a secure protocol" do
|
|
143
|
-
subject.redirect_uri = "http://example.com/callback"
|
|
144
|
-
expect(subject).not_to be_valid
|
|
145
|
-
error = subject.errors[:redirect_uri].first
|
|
146
|
-
expect(error).to eq(I18n.t("activerecord.errors.models.doorkeeper/application.attributes.redirect_uri.secured_uri"))
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
context "multiple redirect uri" do
|
|
151
|
-
it "invalidates the second uri when the first uri is native uri" do
|
|
152
|
-
subject.redirect_uri = "urn:ietf:wg:oauth:2.0:oob\nexample.com/callback"
|
|
153
|
-
expect(subject).to be_invalid
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
context "blank redirect URI" do
|
|
158
|
-
it "forbids blank redirect uri by default" do
|
|
159
|
-
subject.redirect_uri = ""
|
|
160
|
-
|
|
161
|
-
expect(subject).to be_invalid
|
|
162
|
-
expect(subject.errors[:redirect_uri]).not_to be_blank
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
it "forbids blank redirect uri by custom condition" do
|
|
166
|
-
Doorkeeper.configure do
|
|
167
|
-
orm DOORKEEPER_ORM
|
|
168
|
-
allow_blank_redirect_uri do |_grant_flows, application|
|
|
169
|
-
application.name == "admin app"
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
subject.name = "test app"
|
|
174
|
-
subject.redirect_uri = ""
|
|
175
|
-
|
|
176
|
-
expect(subject).to be_invalid
|
|
177
|
-
expect(subject.errors[:redirect_uri]).not_to be_blank
|
|
178
|
-
|
|
179
|
-
subject.name = "admin app"
|
|
180
|
-
expect(subject).to be_valid
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
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
|