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.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +54 -1
  3. data/app/controllers/doorkeeper/applications_controller.rb +3 -3
  4. data/app/controllers/doorkeeper/authorized_applications_controller.rb +1 -1
  5. data/app/views/doorkeeper/applications/_form.html.erb +1 -1
  6. data/lib/doorkeeper/config/abstract_builder.rb +1 -1
  7. data/lib/doorkeeper/config.rb +24 -18
  8. data/lib/doorkeeper/engine.rb +1 -1
  9. data/lib/doorkeeper/helpers/controller.rb +4 -4
  10. data/lib/doorkeeper/models/access_grant_mixin.rb +11 -5
  11. data/lib/doorkeeper/models/access_token_mixin.rb +9 -5
  12. data/lib/doorkeeper/models/application_mixin.rb +5 -4
  13. data/lib/doorkeeper/oauth/authorization/code.rb +1 -1
  14. data/lib/doorkeeper/oauth/authorization/token.rb +1 -1
  15. data/lib/doorkeeper/oauth/client_credentials/creator.rb +2 -2
  16. data/lib/doorkeeper/oauth/client_credentials/validator.rb +3 -1
  17. data/lib/doorkeeper/oauth/code_request.rb +2 -2
  18. data/lib/doorkeeper/oauth/password_access_token_request.rb +1 -1
  19. data/lib/doorkeeper/oauth/pre_authorization.rb +5 -4
  20. data/lib/doorkeeper/oauth/token.rb +4 -5
  21. data/lib/doorkeeper/oauth/token_introspection.rb +1 -5
  22. data/lib/doorkeeper/oauth/token_request.rb +1 -1
  23. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +1 -1
  24. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +1 -1
  25. data/lib/doorkeeper/orm/active_record/mixins/application.rb +64 -9
  26. data/lib/doorkeeper/orm/active_record.rb +10 -2
  27. data/lib/doorkeeper/request/refresh_token.rb +2 -1
  28. data/lib/doorkeeper/server.rb +1 -1
  29. data/lib/doorkeeper/stale_records_cleaner.rb +4 -4
  30. data/lib/doorkeeper/version.rb +1 -1
  31. data/lib/doorkeeper.rb +1 -1
  32. data/lib/generators/doorkeeper/templates/migration.rb.erb +12 -5
  33. metadata +7 -301
  34. data/Appraisals +0 -26
  35. data/CODE_OF_CONDUCT.md +0 -46
  36. data/CONTRIBUTING.md +0 -49
  37. data/Dangerfile +0 -67
  38. data/Dockerfile +0 -29
  39. data/Gemfile +0 -25
  40. data/NEWS.md +0 -1
  41. data/RELEASING.md +0 -11
  42. data/Rakefile +0 -28
  43. data/SECURITY.md +0 -15
  44. data/UPGRADE.md +0 -2
  45. data/bin/console +0 -30
  46. data/doorkeeper.gemspec +0 -42
  47. data/gemfiles/rails_5_0.gemfile +0 -19
  48. data/gemfiles/rails_5_1.gemfile +0 -19
  49. data/gemfiles/rails_5_2.gemfile +0 -19
  50. data/gemfiles/rails_6_0.gemfile +0 -19
  51. data/gemfiles/rails_master.gemfile +0 -19
  52. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  53. data/spec/controllers/applications_controller_spec.rb +0 -274
  54. data/spec/controllers/authorizations_controller_spec.rb +0 -743
  55. data/spec/controllers/protected_resources_controller_spec.rb +0 -361
  56. data/spec/controllers/token_info_controller_spec.rb +0 -50
  57. data/spec/controllers/tokens_controller_spec.rb +0 -499
  58. data/spec/dummy/Rakefile +0 -9
  59. data/spec/dummy/app/assets/config/manifest.js +0 -2
  60. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  61. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
  62. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
  63. data/spec/dummy/app/controllers/home_controller.rb +0 -18
  64. data/spec/dummy/app/controllers/metal_controller.rb +0 -13
  65. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
  66. data/spec/dummy/app/helpers/application_helper.rb +0 -7
  67. data/spec/dummy/app/models/user.rb +0 -11
  68. data/spec/dummy/app/views/home/index.html.erb +0 -0
  69. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  70. data/spec/dummy/config/application.rb +0 -51
  71. data/spec/dummy/config/boot.rb +0 -7
  72. data/spec/dummy/config/database.yml +0 -15
  73. data/spec/dummy/config/environment.rb +0 -5
  74. data/spec/dummy/config/environments/development.rb +0 -31
  75. data/spec/dummy/config/environments/production.rb +0 -64
  76. data/spec/dummy/config/environments/test.rb +0 -45
  77. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
  78. data/spec/dummy/config/initializers/doorkeeper.rb +0 -166
  79. data/spec/dummy/config/initializers/secret_token.rb +0 -10
  80. data/spec/dummy/config/initializers/session_store.rb +0 -10
  81. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  82. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  83. data/spec/dummy/config/routes.rb +0 -13
  84. data/spec/dummy/config.ru +0 -6
  85. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  86. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  87. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -69
  88. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  89. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  90. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -8
  91. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -13
  92. data/spec/dummy/db/schema.rb +0 -70
  93. data/spec/dummy/public/404.html +0 -26
  94. data/spec/dummy/public/422.html +0 -26
  95. data/spec/dummy/public/500.html +0 -26
  96. data/spec/dummy/public/favicon.ico +0 -0
  97. data/spec/dummy/script/rails +0 -9
  98. data/spec/factories.rb +0 -30
  99. data/spec/generators/application_owner_generator_spec.rb +0 -28
  100. data/spec/generators/confidential_applications_generator_spec.rb +0 -29
  101. data/spec/generators/enable_polymorphic_resource_owner_generator_spec.rb +0 -47
  102. data/spec/generators/install_generator_spec.rb +0 -36
  103. data/spec/generators/migration_generator_spec.rb +0 -28
  104. data/spec/generators/pkce_generator_spec.rb +0 -28
  105. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
  106. data/spec/generators/templates/routes.rb +0 -4
  107. data/spec/generators/views_generator_spec.rb +0 -29
  108. data/spec/grape/grape_integration_spec.rb +0 -137
  109. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  110. data/spec/lib/config_spec.rb +0 -813
  111. data/spec/lib/doorkeeper_spec.rb +0 -27
  112. data/spec/lib/models/expirable_spec.rb +0 -61
  113. data/spec/lib/models/reusable_spec.rb +0 -40
  114. data/spec/lib/models/revocable_spec.rb +0 -58
  115. data/spec/lib/models/scopes_spec.rb +0 -61
  116. data/spec/lib/models/secret_storable_spec.rb +0 -135
  117. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
  118. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -180
  119. data/spec/lib/oauth/base_request_spec.rb +0 -210
  120. data/spec/lib/oauth/base_response_spec.rb +0 -45
  121. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  122. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -135
  123. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -110
  124. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -57
  125. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  126. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -108
  127. data/spec/lib/oauth/client_spec.rb +0 -38
  128. data/spec/lib/oauth/code_request_spec.rb +0 -46
  129. data/spec/lib/oauth/code_response_spec.rb +0 -36
  130. data/spec/lib/oauth/error_response_spec.rb +0 -64
  131. data/spec/lib/oauth/error_spec.rb +0 -21
  132. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -20
  133. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -110
  134. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  135. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -262
  136. data/spec/lib/oauth/invalid_request_response_spec.rb +0 -73
  137. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -53
  138. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -201
  139. data/spec/lib/oauth/pre_authorization_spec.rb +0 -218
  140. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -166
  141. data/spec/lib/oauth/scopes_spec.rb +0 -146
  142. data/spec/lib/oauth/token_request_spec.rb +0 -164
  143. data/spec/lib/oauth/token_response_spec.rb +0 -84
  144. data/spec/lib/oauth/token_spec.rb +0 -156
  145. data/spec/lib/option_spec.rb +0 -51
  146. data/spec/lib/request/strategy_spec.rb +0 -54
  147. data/spec/lib/secret_storing/base_spec.rb +0 -60
  148. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
  149. data/spec/lib/secret_storing/plain_spec.rb +0 -44
  150. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
  151. data/spec/lib/server_spec.rb +0 -49
  152. data/spec/lib/stale_records_cleaner_spec.rb +0 -102
  153. data/spec/models/doorkeeper/access_grant_spec.rb +0 -175
  154. data/spec/models/doorkeeper/access_token_spec.rb +0 -650
  155. data/spec/models/doorkeeper/application_spec.rb +0 -442
  156. data/spec/requests/applications/applications_request_spec.rb +0 -259
  157. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  158. data/spec/requests/endpoints/authorization_spec.rb +0 -91
  159. data/spec/requests/endpoints/token_spec.rb +0 -79
  160. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -82
  161. data/spec/requests/flows/authorization_code_spec.rb +0 -530
  162. data/spec/requests/flows/client_credentials_spec.rb +0 -207
  163. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -46
  164. data/spec/requests/flows/implicit_grant_spec.rb +0 -91
  165. data/spec/requests/flows/password_spec.rb +0 -316
  166. data/spec/requests/flows/refresh_token_spec.rb +0 -241
  167. data/spec/requests/flows/revoke_token_spec.rb +0 -196
  168. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  169. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  170. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  171. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  172. data/spec/routing/default_routes_spec.rb +0 -41
  173. data/spec/routing/scoped_routes_spec.rb +0 -47
  174. data/spec/spec_helper.rb +0 -54
  175. data/spec/spec_helper_integration.rb +0 -4
  176. data/spec/support/dependencies/factory_bot.rb +0 -4
  177. data/spec/support/doorkeeper_rspec.rb +0 -22
  178. data/spec/support/helpers/access_token_request_helper.rb +0 -14
  179. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  180. data/spec/support/helpers/config_helper.rb +0 -11
  181. data/spec/support/helpers/model_helper.rb +0 -78
  182. data/spec/support/helpers/request_spec_helper.rb +0 -110
  183. data/spec/support/helpers/url_helper.rb +0 -62
  184. data/spec/support/orm/active_record.rb +0 -5
  185. data/spec/support/shared/controllers_shared_context.rb +0 -133
  186. data/spec/support/shared/hashing_shared_context.rb +0 -36
  187. data/spec/support/shared/models_shared_examples.rb +0 -56
  188. data/spec/validators/redirect_uri_validator_spec.rb +0 -183
  189. 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