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,499 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::TokensController do
6
- let(:client) { FactoryBot.create :application }
7
- let!(:user) { User.create!(name: "Joe", password: "sekret") }
8
-
9
- before do
10
- Doorkeeper.configure do
11
- resource_owner_from_credentials do
12
- User.first
13
- end
14
- end
15
-
16
- allow(Doorkeeper.configuration).to receive(:grant_flows).and_return(["password"])
17
- end
18
-
19
- subject { JSON.parse(response.body) }
20
-
21
- describe "POST #create" do
22
- before do
23
- post :create, params: {
24
- client_id: client.uid,
25
- client_secret: client.secret,
26
- grant_type: "password",
27
- }
28
- end
29
-
30
- it "responds after authorization" do
31
- expect(response).to be_successful
32
- end
33
-
34
- it "includes access token in response" do
35
- expect(subject["access_token"]).to eq(Doorkeeper::AccessToken.first.token)
36
- end
37
-
38
- it "includes token type in response" do
39
- expect(subject["token_type"]).to eq("Bearer")
40
- end
41
-
42
- it "includes token expiration in response" do
43
- expect(subject["expires_in"].to_i).to eq(Doorkeeper.configuration.access_token_expires_in)
44
- end
45
-
46
- it "issues the token for the current client" do
47
- expect(Doorkeeper::AccessToken.first.application_id).to eq(client.id)
48
- end
49
-
50
- it "issues the token for the current resource owner" do
51
- expect(Doorkeeper::AccessToken.first.resource_owner_id).to eq(user.id)
52
- end
53
- end
54
-
55
- describe "POST #create with errors" do
56
- before do
57
- post :create, params: {
58
- client_id: client.uid,
59
- client_secret: "invalid",
60
- grant_type: "password",
61
- }
62
- end
63
-
64
- it "responds after authorization" do
65
- expect(response).to be_unauthorized
66
- end
67
-
68
- it "include error in response" do
69
- expect(subject["error"]).to eq("invalid_client")
70
- end
71
-
72
- it "include error_description in response" do
73
- expect(subject["error_description"]).to be
74
- end
75
-
76
- it "does not include access token in response" do
77
- expect(subject["access_token"]).to be_nil
78
- end
79
-
80
- it "does not include token type in response" do
81
- expect(subject["token_type"]).to be_nil
82
- end
83
-
84
- it "does not include token expiration in response" do
85
- expect(subject["expires_in"]).to be_nil
86
- end
87
-
88
- it "does not issue any access token" do
89
- expect(Doorkeeper::AccessToken.all).to be_empty
90
- end
91
- end
92
-
93
- describe "POST #create with callbacks" do
94
- after do
95
- client.update_attribute :redirect_uri, "urn:ietf:wg:oauth:2.0:oob"
96
- end
97
-
98
- describe "when successful" do
99
- after do
100
- post :create, params: {
101
- client_id: client.uid,
102
- client_secret: client.secret,
103
- grant_type: "password",
104
- }
105
- end
106
-
107
- it "should call :before_successful_authorization callback" do
108
- expect(Doorkeeper.configuration)
109
- .to receive_message_chain(:before_successful_authorization, :call).with(instance_of(described_class), nil)
110
- end
111
-
112
- it "should call :after_successful_authorization callback" do
113
- expect(Doorkeeper.configuration)
114
- .to receive_message_chain(:after_successful_authorization, :call)
115
- .with(instance_of(described_class), instance_of(Doorkeeper::OAuth::Hooks::Context))
116
- end
117
- end
118
-
119
- describe "with errors" do
120
- after do
121
- post :create, params: {
122
- client_id: client.uid,
123
- client_secret: "invalid",
124
- grant_type: "password",
125
- }
126
- end
127
-
128
- it "should call :before_successful_authorization callback" do
129
- expect(Doorkeeper.configuration)
130
- .to receive_message_chain(:before_successful_authorization, :call).with(instance_of(described_class), nil)
131
- end
132
-
133
- it "should not call :after_successful_authorization callback" do
134
- expect(Doorkeeper.configuration).not_to receive(:after_successful_authorization)
135
- end
136
- end
137
- end
138
-
139
- describe "POST #create with custom error" do
140
- it "returns the error response with a custom message" do
141
- # I18n looks for `doorkeeper.errors.messages.custom_message` in locale files
142
- custom_message = "my_message"
143
- allow(I18n).to receive(:translate)
144
- .with(
145
- custom_message,
146
- hash_including(scope: %i[doorkeeper errors messages]),
147
- )
148
- .and_return("Authorization custom message")
149
-
150
- doorkeeper_error = Doorkeeper::Errors::DoorkeeperError.new(custom_message)
151
-
152
- strategy = double(:strategy)
153
- request = double(token_request: strategy)
154
- allow(strategy).to receive(:authorize).and_raise(doorkeeper_error)
155
- allow(controller).to receive(:server).and_return(request)
156
-
157
- post :create
158
-
159
- expected_response_body = {
160
- "error" => custom_message,
161
- "error_description" => "Authorization custom message",
162
- }
163
- expect(response.status).to eq 400
164
- expect(response.headers["WWW-Authenticate"]).to match(/Bearer/)
165
- expect(JSON.parse(response.body)).to eq expected_response_body
166
- end
167
- end
168
-
169
- # http://tools.ietf.org/html/rfc7009#section-2.2
170
- describe "POST #revoke" do
171
- let(:client) { FactoryBot.create(:application) }
172
- let(:access_token) { FactoryBot.create(:access_token, application: client) }
173
-
174
- context "when associated app is public" do
175
- let(:client) { FactoryBot.create(:application, confidential: false) }
176
-
177
- it "returns 200" do
178
- post :revoke, params: { client_id: client.uid, token: access_token.token }
179
-
180
- expect(response.status).to eq 200
181
- end
182
-
183
- it "revokes the access token" do
184
- post :revoke, params: { client_id: client.uid, token: access_token.token }
185
-
186
- expect(access_token.reload).to have_attributes(revoked?: true)
187
- end
188
- end
189
-
190
- context "when associated app is confidential" do
191
- let(:client) { FactoryBot.create(:application, confidential: true) }
192
- let(:oauth_client) { Doorkeeper::OAuth::Client.new(client) }
193
-
194
- before(:each) do
195
- allow_any_instance_of(Doorkeeper::Server).to receive(:client) { oauth_client }
196
- end
197
-
198
- it "returns 200" do
199
- post :revoke, params: { token: access_token.token }
200
-
201
- expect(response.status).to eq 200
202
- end
203
-
204
- it "revokes the access token" do
205
- post :revoke, params: { token: access_token.token }
206
-
207
- expect(access_token.reload).to have_attributes(revoked?: true)
208
- end
209
-
210
- context "when authorization fails" do
211
- let(:some_other_client) { FactoryBot.create(:application, confidential: true) }
212
- let(:oauth_client) { Doorkeeper::OAuth::Client.new(some_other_client) }
213
-
214
- it "returns 403" do
215
- post :revoke, params: { token: access_token.token }
216
-
217
- expect(response.status).to eq 403
218
- end
219
-
220
- it "does not revoke the access token" do
221
- post :revoke, params: { token: access_token.token }
222
-
223
- expect(access_token.reload).to have_attributes(revoked?: false)
224
- end
225
- end
226
- end
227
- end
228
-
229
- describe "POST #introspect" do
230
- let(:client) { FactoryBot.create(:application) }
231
- let(:access_token) { FactoryBot.create(:access_token, application: client) }
232
- let(:token_for_introspection) { FactoryBot.create(:access_token, application: client) }
233
-
234
- context "authorized using valid Bearer token" do
235
- it "responds with full token introspection" do
236
- request.headers["Authorization"] = "Bearer #{access_token.token}"
237
-
238
- post :introspect, params: { token: token_for_introspection.token }
239
-
240
- should_have_json "active", true
241
- expect(json_response).to include("client_id", "token_type", "exp", "iat")
242
- end
243
- end
244
-
245
- context "authorized using Client Credentials of the client that token is issued to" do
246
- it "responds with full token introspection" do
247
- request.headers["Authorization"] = basic_auth_header_for_client(client)
248
-
249
- post :introspect, params: { token: token_for_introspection.token }
250
-
251
- should_have_json "active", true
252
- expect(json_response).to include("client_id", "token_type", "exp", "iat")
253
- should_have_json "client_id", client.uid
254
- end
255
- end
256
-
257
- context "configured token introspection disabled" do
258
- before do
259
- Doorkeeper.configure do
260
- orm DOORKEEPER_ORM
261
- allow_token_introspection false
262
- end
263
- end
264
-
265
- it "responds with invalid_token error" do
266
- request.headers["Authorization"] = "Bearer #{access_token.token}"
267
-
268
- post :introspect, params: { token: token_for_introspection.token }
269
-
270
- response_status_should_be 401
271
-
272
- should_not_have_json "active"
273
- should_have_json "error", "invalid_token"
274
- end
275
- end
276
-
277
- context "using custom introspection response" do
278
- before do
279
- Doorkeeper.configure do
280
- orm DOORKEEPER_ORM
281
- custom_introspection_response do |_token, _context|
282
- {
283
- sub: "Z5O3upPC88QrAjx00dis",
284
- aud: "https://protected.example.net/resource",
285
- }
286
- end
287
- end
288
- end
289
-
290
- it "responds with full token introspection" do
291
- request.headers["Authorization"] = "Bearer #{access_token.token}"
292
-
293
- post :introspect, params: { token: token_for_introspection.token }
294
-
295
- expect(json_response).to include("client_id", "token_type", "exp", "iat", "sub", "aud")
296
- should_have_json "sub", "Z5O3upPC88QrAjx00dis"
297
- should_have_json "aud", "https://protected.example.net/resource"
298
- end
299
- end
300
-
301
- context "public access token" do
302
- let(:token_for_introspection) { FactoryBot.create(:access_token, application: nil) }
303
-
304
- it "responds with full token introspection" do
305
- request.headers["Authorization"] = basic_auth_header_for_client(client)
306
-
307
- post :introspect, params: { token: token_for_introspection.token }
308
-
309
- should_have_json "active", true
310
- expect(json_response).to include("client_id", "token_type", "exp", "iat")
311
- should_have_json "client_id", nil
312
- end
313
- end
314
-
315
- context "token was issued to a different client than is making this request" do
316
- let(:different_client) { FactoryBot.create(:application) }
317
-
318
- it "responds with only active state" do
319
- request.headers["Authorization"] = basic_auth_header_for_client(different_client)
320
-
321
- post :introspect, params: { token: token_for_introspection.token }
322
-
323
- expect(response).to be_successful
324
-
325
- should_have_json "active", false
326
- expect(json_response).not_to include("client_id", "token_type", "exp", "iat")
327
- end
328
- end
329
-
330
- context "introspection request authorized by a client and allow_token_introspection is true" do
331
- let(:different_client) { FactoryBot.create(:application) }
332
-
333
- before do
334
- allow(Doorkeeper.configuration).to receive(:allow_token_introspection).and_return(proc do
335
- true
336
- end)
337
- end
338
-
339
- it "responds with full token introspection" do
340
- request.headers["Authorization"] = basic_auth_header_for_client(different_client)
341
-
342
- post :introspect, params: { token: token_for_introspection.token }
343
-
344
- should_have_json "active", true
345
- expect(json_response).to include("client_id", "token_type", "exp", "iat")
346
- should_have_json "client_id", client.uid
347
- end
348
- end
349
-
350
- context "allow_token_introspection requires authorized token with special scope" do
351
- let(:access_token) { FactoryBot.create(:access_token, scopes: "introspection") }
352
-
353
- before do
354
- allow(Doorkeeper.configuration).to receive(:allow_token_introspection).and_return(proc do |_token, _client, authorized_token|
355
- authorized_token.scopes.include?("introspection")
356
- end)
357
- end
358
-
359
- it "responds with full token introspection if authorized token has introspection scope" do
360
- request.headers["Authorization"] = "Bearer #{access_token.token}"
361
-
362
- post :introspect, params: { token: token_for_introspection.token }
363
-
364
- should_have_json "active", true
365
- expect(json_response).to include("client_id", "token_type", "exp", "iat")
366
- end
367
-
368
- it "responds with invalid_token error if authorized token doesn't have introspection scope" do
369
- access_token.update(scopes: "read write")
370
-
371
- request.headers["Authorization"] = "Bearer #{access_token.token}"
372
-
373
- post :introspect, params: { token: token_for_introspection.token }
374
-
375
- response_status_should_be 401
376
-
377
- should_not_have_json "active"
378
- should_have_json "error", "invalid_token"
379
- end
380
- end
381
-
382
- context "authorized using invalid Bearer token" do
383
- let(:access_token) do
384
- FactoryBot.create(:access_token, application: client, revoked_at: 1.day.ago)
385
- end
386
-
387
- it "responds with invalid_token error" do
388
- request.headers["Authorization"] = "Bearer #{access_token.token}"
389
-
390
- post :introspect, params: { token: token_for_introspection.token }
391
-
392
- response_status_should_be 401
393
-
394
- should_not_have_json "active"
395
- should_have_json "error", "invalid_token"
396
- end
397
- end
398
-
399
- context "authorized using the Bearer token that need to be introspected" do
400
- it "responds with invalid token error" do
401
- request.headers["Authorization"] = "Bearer #{access_token.token}"
402
-
403
- post :introspect, params: { token: access_token.token }
404
-
405
- response_status_should_be 401
406
-
407
- should_not_have_json "active"
408
- should_have_json "error", "invalid_token"
409
- end
410
- end
411
-
412
- context "using invalid credentials to authorize" do
413
- let(:client) { double(uid: "123123", secret: "666999") }
414
- let(:access_token) { FactoryBot.create(:access_token) }
415
-
416
- it "responds with invalid_client error" do
417
- request.headers["Authorization"] = basic_auth_header_for_client(client)
418
-
419
- post :introspect, params: { token: access_token.token }
420
-
421
- expect(response).not_to be_successful
422
- response_status_should_be 401
423
-
424
- should_not_have_json "active"
425
- should_have_json "error", "invalid_client"
426
- end
427
- end
428
-
429
- context "using wrong token value" do
430
- context "authorized using client credentials" do
431
- it "responds with only active state" do
432
- request.headers["Authorization"] = basic_auth_header_for_client(client)
433
-
434
- post :introspect, params: { token: SecureRandom.hex(16) }
435
-
436
- should_have_json "active", false
437
- expect(json_response).not_to include("client_id", "token_type", "exp", "iat")
438
- end
439
- end
440
-
441
- context "authorized using valid Bearer token" do
442
- it "responds with invalid_token error" do
443
- request.headers["Authorization"] = "Bearer #{access_token.token}"
444
-
445
- post :introspect, params: { token: SecureRandom.hex(16) }
446
-
447
- response_status_should_be 401
448
-
449
- should_not_have_json "active"
450
- should_have_json "error", "invalid_token"
451
- end
452
- end
453
- end
454
-
455
- context "when requested access token expired" do
456
- let(:token_for_introspection) do
457
- FactoryBot.create(:access_token, application: client, created_at: 1.year.ago)
458
- end
459
-
460
- it "responds with only active state" do
461
- request.headers["Authorization"] = basic_auth_header_for_client(client)
462
-
463
- post :introspect, params: { token: token_for_introspection.token }
464
-
465
- should_have_json "active", false
466
- expect(json_response).not_to include("client_id", "token_type", "exp", "iat")
467
- end
468
- end
469
-
470
- context "when requested Access Token revoked" do
471
- let(:token_for_introspection) do
472
- FactoryBot.create(:access_token, application: client, revoked_at: 1.year.ago)
473
- end
474
-
475
- it "responds with only active state" do
476
- request.headers["Authorization"] = basic_auth_header_for_client(client)
477
-
478
- post :introspect, params: { token: token_for_introspection.token }
479
-
480
- should_have_json "active", false
481
- expect(json_response).not_to include("client_id", "token_type", "exp", "iat")
482
- end
483
- end
484
-
485
- context "unauthorized (no bearer token or client credentials)" do
486
- let(:token_for_introspection) { FactoryBot.create(:access_token) }
487
-
488
- it "responds with invalid_request error" do
489
- post :introspect, params: { token: token_for_introspection.token }
490
-
491
- expect(response).not_to be_successful
492
- response_status_should_be 400
493
-
494
- should_not_have_json "active"
495
- should_have_json "error", "invalid_request"
496
- end
497
- end
498
- end
499
- end
data/spec/dummy/Rakefile DELETED
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env rake
2
- # frozen_string_literal: true
3
-
4
- # Add your own tasks in files placed in lib/tasks ending in .rake,
5
- # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
6
-
7
- require File.expand_path("config/application", __dir__)
8
-
9
- Dummy::Application.load_tasks
@@ -1,2 +0,0 @@
1
- // JS and CSS bundles
2
- //
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class ApplicationController < ActionController::Base
4
- protect_from_forgery with: :exception
5
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CustomAuthorizationsController < ::ApplicationController
4
- %w[index show new create edit update destroy].each do |action|
5
- define_method action do
6
- render nothing: true
7
- end
8
- end
9
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class FullProtectedResourcesController < ApplicationController
4
- before_action -> { doorkeeper_authorize! :write, :admin }, only: :show
5
- before_action :doorkeeper_authorize!, only: :index
6
-
7
- def index
8
- render plain: "index"
9
- end
10
-
11
- def show
12
- render plain: "show"
13
- end
14
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class HomeController < ApplicationController
4
- def index; end
5
-
6
- def sign_in
7
- session[:user_id] = if Rails.env.development?
8
- User.first || User.create!(name: "Joe", password: "sekret")
9
- else
10
- User.first
11
- end
12
- redirect_to "/"
13
- end
14
-
15
- def callback
16
- render plain: "ok"
17
- end
18
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class MetalController < ActionController::Metal
4
- include AbstractController::Callbacks
5
- include ActionController::Head
6
- include Doorkeeper::Rails::Helpers
7
-
8
- before_action :doorkeeper_authorize!
9
-
10
- def index
11
- self.response_body = { ok: true }.to_json
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class SemiProtectedResourcesController < ApplicationController
4
- before_action :doorkeeper_authorize!, only: :index
5
-
6
- def index
7
- render plain: "protected index"
8
- end
9
-
10
- def show
11
- render plain: "non protected show"
12
- end
13
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ApplicationHelper
4
- def current_user
5
- @current_user ||= User.find_by(id: session[:user_id])
6
- end
7
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class ApplicationRecord < ::ActiveRecord::Base
4
- self.abstract_class = true
5
- end
6
-
7
- class User < ApplicationRecord
8
- def self.authenticate!(name, password)
9
- User.where(name: name, password: password).first
10
- end
11
- end
File without changes
@@ -1,14 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Dummy</title>
5
- <%= csrf_meta_tags %>
6
- </head>
7
- <body>
8
-
9
- <%= link_to "Sign in", '/sign_in' %>
10
-
11
- <%= yield %>
12
-
13
- </body>
14
- </html>
@@ -1,51 +0,0 @@
1
- require File.expand_path("boot", __dir__)
2
-
3
- require "rails"
4
-
5
- %w[
6
- action_controller/railtie
7
- action_view/railtie
8
- action_cable/engine
9
- sprockets/railtie
10
- ].each do |railtie|
11
- begin
12
- require railtie
13
- rescue LoadError => e
14
- puts "Error loading '#{railtie}' (#{e.message})"
15
- end
16
- end
17
-
18
- Bundler.require(*Rails.groups)
19
-
20
- require "yaml"
21
-
22
- orm = if DOORKEEPER_ORM =~ /mongoid/
23
- Mongoid.load!(File.join(File.dirname(File.expand_path(__FILE__)), "#{DOORKEEPER_ORM}.yml"))
24
- :mongoid
25
- else
26
- DOORKEEPER_ORM
27
- end
28
- require "#{orm}/railtie"
29
-
30
- module Dummy
31
- class Application < Rails::Application
32
- if Rails.gem_version < Gem::Version.new("5.1")
33
- config.action_controller.per_form_csrf_tokens = true
34
- config.action_controller.forgery_protection_origin_check = true
35
-
36
- ActiveSupport.to_time_preserves_timezone = true
37
-
38
- if DOORKEEPER_ORM =~ /active_record/
39
- config.active_record.belongs_to_required_by_default = true
40
- end
41
-
42
- config.ssl_options = { hsts: { subdomains: true } }
43
- else
44
- config.load_defaults "#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}"
45
- end
46
-
47
- # Settings in config/environments/* take precedence over those specified here.
48
- # Application configuration should go into files in config/initializers
49
- # -- all .rb files in that directory are automatically loaded.
50
- end
51
- end
@@ -1,7 +0,0 @@
1
- require "rubygems"
2
- require "bundler/setup"
3
-
4
- orm = ENV["BUNDLE_GEMFILE"].match(/Gemfile\.(.+)\.rb/)
5
- DOORKEEPER_ORM = (orm && orm[1]) || :active_record unless defined?(DOORKEEPER_ORM)
6
-
7
- $LOAD_PATH.unshift File.expand_path("../../../lib", __dir__)