doorkeeper 5.4.0.rc1 → 5.4.0.rc2

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.

Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +28 -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.rb +1 -1
  7. data/lib/doorkeeper/config.rb +24 -18
  8. data/lib/doorkeeper/config/abstract_builder.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/client_credentials/creator.rb +2 -2
  14. data/lib/doorkeeper/oauth/client_credentials/validator.rb +3 -1
  15. data/lib/doorkeeper/oauth/password_access_token_request.rb +1 -1
  16. data/lib/doorkeeper/oauth/pre_authorization.rb +5 -4
  17. data/lib/doorkeeper/oauth/token.rb +1 -2
  18. data/lib/doorkeeper/orm/active_record.rb +10 -2
  19. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +1 -1
  20. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +1 -1
  21. data/lib/doorkeeper/orm/active_record/mixins/application.rb +64 -9
  22. data/lib/doorkeeper/request/refresh_token.rb +2 -1
  23. data/lib/doorkeeper/version.rb +1 -1
  24. data/lib/generators/doorkeeper/templates/migration.rb.erb +12 -5
  25. metadata +5 -299
  26. data/Appraisals +0 -26
  27. data/CODE_OF_CONDUCT.md +0 -46
  28. data/CONTRIBUTING.md +0 -49
  29. data/Dangerfile +0 -67
  30. data/Dockerfile +0 -29
  31. data/Gemfile +0 -25
  32. data/NEWS.md +0 -1
  33. data/RELEASING.md +0 -11
  34. data/Rakefile +0 -28
  35. data/SECURITY.md +0 -15
  36. data/UPGRADE.md +0 -2
  37. data/bin/console +0 -30
  38. data/doorkeeper.gemspec +0 -42
  39. data/gemfiles/rails_5_0.gemfile +0 -19
  40. data/gemfiles/rails_5_1.gemfile +0 -19
  41. data/gemfiles/rails_5_2.gemfile +0 -19
  42. data/gemfiles/rails_6_0.gemfile +0 -19
  43. data/gemfiles/rails_master.gemfile +0 -19
  44. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  45. data/spec/controllers/applications_controller_spec.rb +0 -274
  46. data/spec/controllers/authorizations_controller_spec.rb +0 -743
  47. data/spec/controllers/protected_resources_controller_spec.rb +0 -361
  48. data/spec/controllers/token_info_controller_spec.rb +0 -50
  49. data/spec/controllers/tokens_controller_spec.rb +0 -499
  50. data/spec/dummy/Rakefile +0 -9
  51. data/spec/dummy/app/assets/config/manifest.js +0 -2
  52. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  53. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
  54. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
  55. data/spec/dummy/app/controllers/home_controller.rb +0 -18
  56. data/spec/dummy/app/controllers/metal_controller.rb +0 -13
  57. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
  58. data/spec/dummy/app/helpers/application_helper.rb +0 -7
  59. data/spec/dummy/app/models/user.rb +0 -11
  60. data/spec/dummy/app/views/home/index.html.erb +0 -0
  61. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  62. data/spec/dummy/config.ru +0 -6
  63. data/spec/dummy/config/application.rb +0 -51
  64. data/spec/dummy/config/boot.rb +0 -7
  65. data/spec/dummy/config/database.yml +0 -15
  66. data/spec/dummy/config/environment.rb +0 -5
  67. data/spec/dummy/config/environments/development.rb +0 -31
  68. data/spec/dummy/config/environments/production.rb +0 -64
  69. data/spec/dummy/config/environments/test.rb +0 -45
  70. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
  71. data/spec/dummy/config/initializers/doorkeeper.rb +0 -166
  72. data/spec/dummy/config/initializers/secret_token.rb +0 -10
  73. data/spec/dummy/config/initializers/session_store.rb +0 -10
  74. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  75. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  76. data/spec/dummy/config/routes.rb +0 -13
  77. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  78. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  79. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -69
  80. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  81. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  82. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -8
  83. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -13
  84. data/spec/dummy/db/schema.rb +0 -70
  85. data/spec/dummy/public/404.html +0 -26
  86. data/spec/dummy/public/422.html +0 -26
  87. data/spec/dummy/public/500.html +0 -26
  88. data/spec/dummy/public/favicon.ico +0 -0
  89. data/spec/dummy/script/rails +0 -9
  90. data/spec/factories.rb +0 -30
  91. data/spec/generators/application_owner_generator_spec.rb +0 -28
  92. data/spec/generators/confidential_applications_generator_spec.rb +0 -29
  93. data/spec/generators/enable_polymorphic_resource_owner_generator_spec.rb +0 -47
  94. data/spec/generators/install_generator_spec.rb +0 -36
  95. data/spec/generators/migration_generator_spec.rb +0 -28
  96. data/spec/generators/pkce_generator_spec.rb +0 -28
  97. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
  98. data/spec/generators/templates/routes.rb +0 -4
  99. data/spec/generators/views_generator_spec.rb +0 -29
  100. data/spec/grape/grape_integration_spec.rb +0 -137
  101. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  102. data/spec/lib/config_spec.rb +0 -813
  103. data/spec/lib/doorkeeper_spec.rb +0 -27
  104. data/spec/lib/models/expirable_spec.rb +0 -61
  105. data/spec/lib/models/reusable_spec.rb +0 -40
  106. data/spec/lib/models/revocable_spec.rb +0 -58
  107. data/spec/lib/models/scopes_spec.rb +0 -61
  108. data/spec/lib/models/secret_storable_spec.rb +0 -135
  109. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
  110. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -180
  111. data/spec/lib/oauth/base_request_spec.rb +0 -210
  112. data/spec/lib/oauth/base_response_spec.rb +0 -45
  113. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  114. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -135
  115. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -110
  116. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -57
  117. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  118. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -108
  119. data/spec/lib/oauth/client_spec.rb +0 -38
  120. data/spec/lib/oauth/code_request_spec.rb +0 -46
  121. data/spec/lib/oauth/code_response_spec.rb +0 -36
  122. data/spec/lib/oauth/error_response_spec.rb +0 -64
  123. data/spec/lib/oauth/error_spec.rb +0 -21
  124. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -20
  125. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -110
  126. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  127. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -262
  128. data/spec/lib/oauth/invalid_request_response_spec.rb +0 -73
  129. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -53
  130. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -201
  131. data/spec/lib/oauth/pre_authorization_spec.rb +0 -218
  132. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -166
  133. data/spec/lib/oauth/scopes_spec.rb +0 -146
  134. data/spec/lib/oauth/token_request_spec.rb +0 -164
  135. data/spec/lib/oauth/token_response_spec.rb +0 -84
  136. data/spec/lib/oauth/token_spec.rb +0 -156
  137. data/spec/lib/option_spec.rb +0 -51
  138. data/spec/lib/request/strategy_spec.rb +0 -54
  139. data/spec/lib/secret_storing/base_spec.rb +0 -60
  140. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
  141. data/spec/lib/secret_storing/plain_spec.rb +0 -44
  142. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
  143. data/spec/lib/server_spec.rb +0 -49
  144. data/spec/lib/stale_records_cleaner_spec.rb +0 -102
  145. data/spec/models/doorkeeper/access_grant_spec.rb +0 -175
  146. data/spec/models/doorkeeper/access_token_spec.rb +0 -650
  147. data/spec/models/doorkeeper/application_spec.rb +0 -442
  148. data/spec/requests/applications/applications_request_spec.rb +0 -259
  149. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  150. data/spec/requests/endpoints/authorization_spec.rb +0 -91
  151. data/spec/requests/endpoints/token_spec.rb +0 -79
  152. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -82
  153. data/spec/requests/flows/authorization_code_spec.rb +0 -530
  154. data/spec/requests/flows/client_credentials_spec.rb +0 -207
  155. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -46
  156. data/spec/requests/flows/implicit_grant_spec.rb +0 -91
  157. data/spec/requests/flows/password_spec.rb +0 -316
  158. data/spec/requests/flows/refresh_token_spec.rb +0 -241
  159. data/spec/requests/flows/revoke_token_spec.rb +0 -196
  160. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  161. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  162. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  163. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  164. data/spec/routing/default_routes_spec.rb +0 -41
  165. data/spec/routing/scoped_routes_spec.rb +0 -47
  166. data/spec/spec_helper.rb +0 -54
  167. data/spec/spec_helper_integration.rb +0 -4
  168. data/spec/support/dependencies/factory_bot.rb +0 -4
  169. data/spec/support/doorkeeper_rspec.rb +0 -22
  170. data/spec/support/helpers/access_token_request_helper.rb +0 -14
  171. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  172. data/spec/support/helpers/config_helper.rb +0 -11
  173. data/spec/support/helpers/model_helper.rb +0 -78
  174. data/spec/support/helpers/request_spec_helper.rb +0 -110
  175. data/spec/support/helpers/url_helper.rb +0 -62
  176. data/spec/support/orm/active_record.rb +0 -5
  177. data/spec/support/shared/controllers_shared_context.rb +0 -133
  178. data/spec/support/shared/hashing_shared_context.rb +0 -36
  179. data/spec/support/shared/models_shared_examples.rb +0 -56
  180. data/spec/validators/redirect_uri_validator_spec.rb +0 -183
  181. data/spec/version/version_spec.rb +0 -17
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::OAuth::InvalidTokenResponse do
6
- describe "#name" do
7
- it { expect(subject.name).to eq(:invalid_token) }
8
- end
9
-
10
- describe "#status" do
11
- it { expect(subject.status).to eq(:unauthorized) }
12
- end
13
-
14
- describe ".from_access_token" do
15
- let(:response) { described_class.from_access_token(access_token) }
16
-
17
- context "revoked" do
18
- let(:access_token) { double(revoked?: true, expired?: true) }
19
-
20
- it "sets a description" do
21
- expect(response.description).to include("revoked")
22
- end
23
-
24
- it "sets the reason" do
25
- expect(response.reason).to eq(:revoked)
26
- end
27
- end
28
-
29
- context "expired" do
30
- let(:access_token) { double(revoked?: false, expired?: true) }
31
-
32
- it "sets a description" do
33
- expect(response.description).to include("expired")
34
- end
35
-
36
- it "sets the reason" do
37
- expect(response.reason).to eq(:expired)
38
- end
39
- end
40
-
41
- context "unknown" do
42
- let(:access_token) { double(revoked?: false, expired?: false) }
43
-
44
- it "sets a description" do
45
- expect(response.description).to include("invalid")
46
- end
47
-
48
- it "sets the reason" do
49
- expect(response.reason).to eq(:unknown)
50
- end
51
- end
52
- end
53
- end
@@ -1,201 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::OAuth::PasswordAccessTokenRequest do
6
- let(:server) do
7
- double(
8
- :server,
9
- default_scopes: Doorkeeper::OAuth::Scopes.new,
10
- access_token_expires_in: 2.hours,
11
- refresh_token_enabled?: false,
12
- custom_access_token_expires_in: lambda { |context|
13
- context.grant_type == Doorkeeper::OAuth::PASSWORD ? 1234 : nil
14
- },
15
- )
16
- end
17
- let(:client) { FactoryBot.create(:application) }
18
- let(:owner) { FactoryBot.create(:resource_owner) }
19
-
20
- before do
21
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
22
- end
23
-
24
- subject do
25
- described_class.new(server, client, owner)
26
- end
27
-
28
- it "issues a new token for the client" do
29
- expect do
30
- subject.authorize
31
- end.to change { client.reload.access_tokens.count }.by(1)
32
-
33
- expect(client.reload.access_tokens.max_by(&:created_at).expires_in).to eq(1234)
34
- end
35
-
36
- it "issues a new token without a client" do
37
- subject = described_class.new(server, nil, owner)
38
- expect(subject).to be_valid
39
-
40
- expect do
41
- subject.authorize
42
- end.to change { Doorkeeper::AccessToken.count }.by(1)
43
- end
44
-
45
- it "does not issue a new token with an invalid client" do
46
- subject = described_class.new(server, nil, owner, { client_id: "bad_id" })
47
- expect do
48
- subject.authorize
49
- end.not_to(change { Doorkeeper::AccessToken.count })
50
-
51
- expect(subject.error).to eq(:invalid_client)
52
- end
53
-
54
- it "requires the owner" do
55
- subject = described_class.new(server, client, nil)
56
- subject.validate
57
- expect(subject.error).to eq(:invalid_grant)
58
- end
59
-
60
- it "creates token even when there is already one (default)" do
61
- FactoryBot.create(
62
- :access_token,
63
- application_id: client.id,
64
- resource_owner_id: owner.id,
65
- resource_owner_type: owner.class.name,
66
- )
67
-
68
- expect do
69
- subject.authorize
70
- end.to change { Doorkeeper::AccessToken.count }.by(1)
71
- end
72
-
73
- it "skips token creation if there is already one reusable" do
74
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
75
- FactoryBot.create(
76
- :access_token,
77
- application_id: client.id,
78
- resource_owner_id: owner.id,
79
- resource_owner_type: owner.class.name,
80
- )
81
-
82
- expect do
83
- subject.authorize
84
- end.not_to(change { Doorkeeper::AccessToken.count })
85
- end
86
-
87
- it "creates token when there is already one but non reusable" do
88
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
89
- FactoryBot.create(
90
- :access_token,
91
- application_id: client.id,
92
- resource_owner_id: owner.id,
93
- resource_owner_type: owner.class.name,
94
- )
95
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:reusable?).and_return(false)
96
-
97
- expect do
98
- subject.authorize
99
- end.to change { Doorkeeper::AccessToken.count }.by(1)
100
- end
101
-
102
- it "calls configured request callback methods" do
103
- expect(Doorkeeper.configuration.before_successful_strategy_response)
104
- .to receive(:call).with(subject).once
105
-
106
- expect(Doorkeeper.configuration.after_successful_strategy_response)
107
- .to receive(:call).with(subject, instance_of(Doorkeeper::OAuth::TokenResponse)).once
108
-
109
- subject.authorize
110
- end
111
-
112
- describe "with scopes" do
113
- subject do
114
- described_class.new(server, client, owner, scope: "public")
115
- end
116
-
117
- context "when scopes_by_grant_type is not configured for grant_type" do
118
- it "returns error when scopes are invalid" do
119
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("another"))
120
- subject.validate
121
- expect(subject.error).to eq(:invalid_scope)
122
- end
123
-
124
- it "creates the token with scopes if scopes are valid" do
125
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
126
- expect do
127
- subject.authorize
128
- end.to change { Doorkeeper::AccessToken.count }.by(1)
129
-
130
- expect(Doorkeeper::AccessToken.last.scopes).to include("public")
131
- end
132
- end
133
-
134
- context "when scopes_by_grant_type is configured for grant_type" do
135
- it "returns error when scopes are valid but not permitted for grant_type" do
136
- allow(server)
137
- .to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
138
- allow(Doorkeeper.configuration)
139
- .to receive(:scopes_by_grant_type).and_return(password: "another")
140
- subject.validate
141
- expect(subject.error).to eq(:invalid_scope)
142
- end
143
-
144
- it "creates the token with scopes if scopes are valid and permitted for grant_type" do
145
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
146
- allow(Doorkeeper.configuration)
147
- .to receive(:scopes_by_grant_type).and_return(password: [:public])
148
-
149
- expect do
150
- subject.authorize
151
- end.to change { Doorkeeper::AccessToken.count }.by(1)
152
-
153
- expect(Doorkeeper::AccessToken.last.scopes).to include("public")
154
- end
155
- end
156
- end
157
-
158
- describe "with custom expiry" do
159
- let(:server) do
160
- double(
161
- :server,
162
- default_scopes: Doorkeeper::OAuth::Scopes.new,
163
- access_token_expires_in: 2.hours,
164
- refresh_token_enabled?: false,
165
- custom_access_token_expires_in: lambda { |context|
166
- if context.scopes.exists?("public")
167
- 222
168
- elsif context.scopes.exists?("magic")
169
- Float::INFINITY
170
- end
171
- },
172
- )
173
- end
174
-
175
- before do
176
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
177
- end
178
-
179
- it "checks scopes" do
180
- subject = described_class.new(server, client, owner, scope: "public")
181
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
182
-
183
- expect do
184
- subject.authorize
185
- end.to change { Doorkeeper::AccessToken.count }.by(1)
186
-
187
- expect(Doorkeeper::AccessToken.last.expires_in).to eq(222)
188
- end
189
-
190
- it "falls back to the default otherwise" do
191
- subject = described_class.new(server, client, owner, scope: "private")
192
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("private"))
193
-
194
- expect do
195
- subject.authorize
196
- end.to change { Doorkeeper::AccessToken.count }.by(1)
197
-
198
- expect(Doorkeeper::AccessToken.last.expires_in).to eq(2.hours)
199
- end
200
- end
201
- end
@@ -1,218 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::OAuth::PreAuthorization do
6
- let(:server) do
7
- server = Doorkeeper.configuration
8
- allow(server).to receive(:default_scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("default"))
9
- allow(server).to receive(:optional_scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public profile"))
10
- server
11
- end
12
-
13
- let(:application) { FactoryBot.create(:application, redirect_uri: "https://app.com/callback") }
14
- let(:client) { Doorkeeper::OAuth::Client.find(application.uid) }
15
-
16
- let :attributes do
17
- {
18
- client_id: client.uid,
19
- response_type: "code",
20
- redirect_uri: "https://app.com/callback",
21
- state: "save-this",
22
- current_resource_owner: Object.new,
23
- }
24
- end
25
-
26
- subject do
27
- described_class.new(server, attributes)
28
- end
29
-
30
- it "is authorizable when request is valid" do
31
- expect(subject).to be_authorizable
32
- end
33
-
34
- it "accepts code as response type" do
35
- attributes[:response_type] = "code"
36
- expect(subject).to be_authorizable
37
- end
38
-
39
- it "accepts token as response type" do
40
- allow(server).to receive(:grant_flows).and_return(["implicit"])
41
- attributes[:response_type] = "token"
42
- expect(subject).to be_authorizable
43
- end
44
-
45
- context "when using default grant flows" do
46
- it 'accepts "code" as response type' do
47
- attributes[:response_type] = "code"
48
- expect(subject).to be_authorizable
49
- end
50
-
51
- it 'accepts "token" as response type' do
52
- allow(server).to receive(:grant_flows).and_return(["implicit"])
53
- attributes[:response_type] = "token"
54
- expect(subject).to be_authorizable
55
- end
56
- end
57
-
58
- context "when authorization code grant flow is disabled" do
59
- before do
60
- allow(server).to receive(:grant_flows).and_return(["implicit"])
61
- end
62
-
63
- it 'does not accept "code" as response type' do
64
- attributes[:response_type] = "code"
65
- expect(subject).not_to be_authorizable
66
- end
67
- end
68
-
69
- context "when implicit grant flow is disabled" do
70
- before do
71
- allow(server).to receive(:grant_flows).and_return(["authorization_code"])
72
- end
73
-
74
- it 'does not accept "token" as response type' do
75
- attributes[:response_type] = "token"
76
- expect(subject).not_to be_authorizable
77
- end
78
- end
79
-
80
- context "client application does not restrict valid scopes" do
81
- it "accepts valid scopes" do
82
- attributes[:scope] = "public"
83
- expect(subject).to be_authorizable
84
- end
85
-
86
- it "rejects (globally) non-valid scopes" do
87
- attributes[:scope] = "invalid"
88
- expect(subject).not_to be_authorizable
89
- end
90
-
91
- it "accepts scopes which are permitted for grant_type" do
92
- allow(server).to receive(:scopes_by_grant_type).and_return(authorization_code: [:public])
93
- attributes[:scope] = "public"
94
- expect(subject).to be_authorizable
95
- end
96
-
97
- it "rejects scopes which are not permitted for grant_type" do
98
- allow(server).to receive(:scopes_by_grant_type).and_return(authorization_code: [:profile])
99
- attributes[:scope] = "public"
100
- expect(subject).not_to be_authorizable
101
- end
102
- end
103
-
104
- context "client application restricts valid scopes" do
105
- let(:application) do
106
- FactoryBot.create(:application, scopes: Doorkeeper::OAuth::Scopes.from_string("public nonsense"))
107
- end
108
-
109
- it "accepts valid scopes" do
110
- attributes[:scope] = "public"
111
- expect(subject).to be_authorizable
112
- end
113
-
114
- it "rejects (globally) non-valid scopes" do
115
- attributes[:scope] = "invalid"
116
- expect(subject).not_to be_authorizable
117
- end
118
-
119
- it "rejects (application level) non-valid scopes" do
120
- attributes[:scope] = "profile"
121
- expect(subject).to_not be_authorizable
122
- end
123
-
124
- it "accepts scopes which are permitted for grant_type" do
125
- allow(server).to receive(:scopes_by_grant_type).and_return(authorization_code: [:public])
126
- attributes[:scope] = "public"
127
- expect(subject).to be_authorizable
128
- end
129
-
130
- it "rejects scopes which are not permitted for grant_type" do
131
- allow(server).to receive(:scopes_by_grant_type).and_return(authorization_code: [:profile])
132
- attributes[:scope] = "public"
133
- expect(subject).not_to be_authorizable
134
- end
135
- end
136
-
137
- context "when scope is not provided to pre_authorization" do
138
- before { attributes[:scope] = nil }
139
-
140
- context "when default scopes is provided" do
141
- it "uses default scopes" do
142
- allow(server).to receive(:default_scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("default_scope"))
143
- expect(subject).to be_authorizable
144
- expect(subject.scope).to eq("default_scope")
145
- expect(subject.scopes).to eq(Doorkeeper::OAuth::Scopes.from_string("default_scope"))
146
- end
147
- end
148
-
149
- context "when default scopes is none" do
150
- it "not be authorizable when none default scope" do
151
- allow(server).to receive(:default_scopes).and_return(Doorkeeper::OAuth::Scopes.new)
152
- expect(subject).not_to be_authorizable
153
- end
154
- end
155
- end
156
-
157
- it "matches the redirect uri against client's one" do
158
- attributes[:redirect_uri] = "http://nothesame.com"
159
- expect(subject).not_to be_authorizable
160
- end
161
-
162
- it "stores the state" do
163
- expect(subject.state).to eq("save-this")
164
- end
165
-
166
- it "rejects if response type is not allowed" do
167
- attributes[:response_type] = "whops"
168
- expect(subject).not_to be_authorizable
169
- end
170
-
171
- it "requires an existing client" do
172
- attributes[:client_id] = nil
173
- expect(subject).not_to be_authorizable
174
- end
175
-
176
- it "requires a redirect uri" do
177
- attributes[:redirect_uri] = nil
178
- expect(subject).not_to be_authorizable
179
- end
180
-
181
- context "when resource_owner cannot access client application" do
182
- before { allow(Doorkeeper.configuration).to receive(:authorize_resource_owner_for_client).and_return(->(*_) { false }) }
183
-
184
- it "is not authorizable" do
185
- expect(subject).not_to be_authorizable
186
- end
187
- end
188
-
189
- describe "as_json" do
190
- before { subject.authorizable? }
191
-
192
- it { is_expected.to respond_to :as_json }
193
-
194
- shared_examples "returns the pre authorization" do
195
- it "returns the pre authorization" do
196
- expect(json[:client_id]).to eq client.uid
197
- expect(json[:redirect_uri]).to eq subject.redirect_uri
198
- expect(json[:state]).to eq subject.state
199
- expect(json[:response_type]).to eq subject.response_type
200
- expect(json[:scope]).to eq subject.scope
201
- expect(json[:client_name]).to eq client.name
202
- expect(json[:status]).to eq I18n.t("doorkeeper.pre_authorization.status")
203
- end
204
- end
205
-
206
- context "when called without params" do
207
- let(:json) { subject.as_json }
208
-
209
- include_examples "returns the pre authorization"
210
- end
211
-
212
- context "when called with params" do
213
- let(:json) { subject.as_json(foo: "bar") }
214
-
215
- include_examples "returns the pre authorization"
216
- end
217
- end
218
- end