doorkeeper-mongodb 5.3.0 → 5.5.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 (192) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/Rakefile +18 -4
  4. data/lib/doorkeeper/orm/mongoid9/access_grant.rb +26 -0
  5. data/lib/doorkeeper/orm/mongoid9/access_token.rb +38 -0
  6. data/lib/doorkeeper/orm/mongoid9/application.rb +43 -0
  7. data/lib/doorkeeper/orm/mongoid9/stale_records_cleaner.rb +11 -0
  8. data/lib/doorkeeper/orm/mongoid9.rb +50 -0
  9. data/lib/doorkeeper-mongodb/mixins/mongoid/access_grant_mixin.rb +6 -2
  10. data/lib/doorkeeper-mongodb/mixins/mongoid/access_token_mixin.rb +46 -6
  11. data/lib/doorkeeper-mongodb/mixins/mongoid/application_mixin.rb +2 -2
  12. data/lib/doorkeeper-mongodb/version.rb +1 -1
  13. data/lib/doorkeeper-mongodb.rb +1 -0
  14. data/spec/dummy/app/assets/config/manifest.js +0 -0
  15. data/spec/dummy/app/controllers/application_controller.rb +0 -0
  16. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -0
  17. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -0
  18. data/spec/dummy/app/controllers/home_controller.rb +0 -0
  19. data/spec/dummy/app/controllers/metal_controller.rb +0 -0
  20. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -0
  21. data/spec/dummy/app/helpers/application_helper.rb +0 -0
  22. data/spec/dummy/app/views/home/index.html.erb +0 -0
  23. data/spec/dummy/app/views/layouts/application.html.erb +0 -0
  24. data/spec/dummy/config/application.rb +0 -0
  25. data/spec/dummy/config/boot.rb +0 -0
  26. data/spec/dummy/config/database.yml +0 -0
  27. data/spec/dummy/config/environment.rb +0 -0
  28. data/spec/dummy/config/environments/development.rb +0 -0
  29. data/spec/dummy/config/environments/production.rb +0 -0
  30. data/spec/dummy/config/environments/test.rb +0 -0
  31. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -0
  32. data/spec/dummy/config/initializers/doorkeeper.rb +7 -2
  33. data/spec/dummy/config/initializers/secret_token.rb +0 -0
  34. data/spec/dummy/config/initializers/session_store.rb +0 -0
  35. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -0
  36. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -0
  37. data/spec/dummy/config/mongoid8.yml +19 -0
  38. data/spec/dummy/config/mongoid9.yml +19 -0
  39. data/spec/dummy/config/routes.rb +0 -0
  40. data/spec/dummy/config.ru +1 -1
  41. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -0
  42. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -0
  43. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -0
  44. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -0
  45. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -0
  46. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -0
  47. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -0
  48. data/spec/dummy/db/migrate/20230205064514_add_custom_attributes.rb +8 -0
  49. data/spec/dummy/db/schema.rb +3 -1
  50. data/spec/dummy/log/test.log +39440 -0
  51. data/spec/dummy/public/404.html +0 -0
  52. data/spec/dummy/public/422.html +0 -0
  53. data/spec/dummy/public/500.html +0 -0
  54. data/spec/dummy/public/favicon.ico +0 -0
  55. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/2L/2LdlR-88TqZc8vSU7Z58xiNpCGRZj0CIlOxSN4Vx2i4.cache +1 -0
  56. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{Pn/PnXU_mkG2fLZFm9BwiZ03BZdBTjKuInP-cRXjHS7yJo.cache → 2r/2r0L9eNOmETsg4Tm1IgBdw3J4ahcko41NpILRXu19_A.cache} +0 -0
  57. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/5y/5ywocFQgpSY36nyF_xDKPExhDRo-eqeiqfDvQee1K9k.cache +2 -0
  58. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{Qs/QsVgO6vM5Yn9oeYTYlrqtyVnK6sdVDWDa083N7zpfHw.cache → 8r/8rW0CpDDUJZ7xvg86t6jZ6WmyvaVZ0uTPEPRjghFIKo.cache} +0 -0
  59. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{PA/PAH_jI20wRw12tngeJ-V619c30avNLDu5U9Z-9Pc5SQ.cache → Cs/CsfBL8Dls9-jhjFsNYt4DZxu5LWChDMB-xXKjsEFSsU.cache} +0 -0
  60. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{8D/8DJG7JfPvShfLLyeSom6NZ_TcQc6QH27tJ7prEWZPfI.cache → Cv/Cv9WXE_0OqtPUZBXfTWaE8uKx9oFIzqO18ZkwVaBLSg.cache} +0 -0
  61. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Mf/MfB2-0nbsmC548XBSLftafi6BZ9nAquBA-6eu7mAmdE.cache +2 -0
  62. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/N2/N2cUP-Um_nQ5ZTCQr_H0bKIjOSIyV7Ry5sT6-DB9e4A.cache +1 -0
  63. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{FJ/FJlQpfMtpRbrM5P8A7d2FAelFKwo6GrVs2xks8z5GKU.cache → Ot/OtNAnT3d-csAKBtJ8UBLOSwUDyfmOdCWpS08RaSCGsQ.cache} +0 -0
  64. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/P3/P33RwiTMGEu2wZySBEUmf5U7hnfBhdL49wzdUWXYNRs.cache +1 -0
  65. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/RZ/RZAL9gIt4aD731Ikf7UZZNPSZXzhPqtDskLB7nQcWH4.cache +1 -0
  66. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/SQ/SQVJeYO2bM0qgQiOaeVBjYo3SWQZmvixa3tXUjsmuUs.cache +0 -0
  67. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{Ma/MaK3K1AoZZ4xM5fOOifhROd73hfZJpP4yGbkGdoYtEk.cache → V2/V2JApVhUSYhvWnNVIbpe58U4xheVkpi0gCStqjDN6-A.cache} +0 -0
  68. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{Lk/LklIq5hrBAPESXVUpFMwQ9L-1qTj90sPVi6U19_Xi-Q.cache → VA/VADOUaZFukufOb44ts4KoyQZumPcVJET0bi9RvC7c-o.cache} +1 -1
  69. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Vz/VzdPLfWn16XbpHNJdkDMamAf3QutM29cvvPkDNyy5nE.cache +1 -0
  70. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/W9/W9QfraySVwoRt-SgGOIS0e-iP8R1qP_URwXZw1l6M5E.cache +0 -0
  71. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Wy/Wyiw07ngOzgV6RPis_Lo2hhSRkwo2YSqKTEDAF0crhA.cache +0 -0
  72. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Z6/Z6rAtdVt3OXS26vLVCtdO3vmMlttI3ajdpbC2FHk7iQ.cache +0 -0
  73. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/b6/b6QRH6ZdCc0e6bUWu4qni_kZmptaMgWciO8Jl9q6_p8.cache +0 -0
  74. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{Pm/PmheG0PGFqDws1qgFOxOyIL-gpMof3Ar9eSRKVLYuik.cache → fP/fPihom3hnc1rQQxpviTvZPRJB_IghWYWP3dDcsGrcLk.cache} +0 -0
  75. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/gD/gDU38plXvosMgFK47_PBI9xGVsmsE2tShWEZzxiek3k.cache +1 -0
  76. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/gR/gRqL5_jaFW7eA3d2frJmOzw_vFLuvfhwMhotAlsO8J4.cache +2 -0
  77. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/jC/jCTZ1jAldKBn4OTANBBmCKzxLrDgok1ur4meoTqlDNg.cache +0 -0
  78. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{yN/yNOFGOsnHmxXNMkuEAWuL1u3jlmdvrdeoTx6DDJ1in8.cache → jc/jcB8w1gBT7JP10DW4OOvvYpW1ZFeMyedngmMy3QbRLQ.cache} +0 -0
  79. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/jg/jgxXkkkXf1NPOPrpNdEJzhDt-2xHGzd_-mLkIHWrOr4.cache +2 -0
  80. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/nx/nxzZnvk5YyBhTUloQSZZ5zRuaqlsLiHy_AbOzQ3d788.cache +0 -0
  81. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/wr/wrlf8nUW2yftpcIA97qImyECR8f8o3OiOdHLdfkmw8c.cache +1 -0
  82. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{qT/qTQIQsmS0Wbbg2JxNn9rxdI5qVOTg5SfyQdaTvr9vLo.cache → xd/xdD4KJ55W3jy5PIrwT0UnDp1toKpUfgrjJBgB4WaPIc.cache} +0 -0
  83. data/spec/support/doorkeeper_rspec.rb +0 -0
  84. data/spec/support/orm/mongoid.rb +18 -2
  85. data/spec/support/orm/mongoid8.rb +6 -0
  86. data/spec/support/orm/mongoid9.rb +6 -0
  87. data/spec/support/render_with_matcher.rb +26 -0
  88. metadata +126 -241
  89. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  90. data/spec/controllers/applications_controller_spec.rb +0 -270
  91. data/spec/controllers/authorizations_controller_spec.rb +0 -744
  92. data/spec/controllers/protected_resources_controller_spec.rb +0 -361
  93. data/spec/controllers/token_info_controller_spec.rb +0 -50
  94. data/spec/controllers/tokens_controller_spec.rb +0 -542
  95. data/spec/doorkeeper/redirect_uri_validator_spec.rb +0 -183
  96. data/spec/doorkeeper/server_spec.rb +0 -50
  97. data/spec/doorkeeper/stale_records_cleaner_spec.rb +0 -103
  98. data/spec/doorkeeper/version_spec.rb +0 -17
  99. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/-o/-ofn45zIfO5vx4VD6m6NXesLf6da5usA-Sbw2SVju3o.cache +0 -2
  100. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/0_/0_ouGcG_o_1zmVmBe-tdQYk594LBwVa1bumjrKtdfEw.cache +0 -0
  101. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/2X/2XMMcHbyTSRqh1GkV0xzyIETNtt-zgN6iniziShaKmQ.cache +0 -2
  102. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/4Q/4QQw-pMQ98JIj3xdcFhGBQdysdGPY9rWffRqWMmyjew.cache +0 -1
  103. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/7H/7HjRsym0tTpXFCVhWt6kteMs_-CozKVbr9s5syHm8es.cache +0 -1
  104. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/8B/8BxJyv22HPFHu1se_l2J8qW1N9NzZ16UOWOy1YMSgs4.cache +0 -1
  105. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/9x/9xjtGv-yKjj62x9uFwBZg8pTSh9ERPAgANwNo9uwIaA.cache +0 -1
  106. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Bt/BtXO7f0PZ8DNt3TMLYM-zY7LkbWa_KgyB0v1V98M1CQ.cache +0 -1
  107. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/E0/E02f1Q2tutWumMulGCFNfqQNjvEP_hMAK_5E83eWepI.cache +0 -0
  108. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/EZ/EZGpd6pUEJZxO6uT2yIS4Fpn5KX7VDgC9VB3AaemF5Q.cache +0 -2
  109. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/L8/L8mOWakJlWKr6MU85rj0V7yGFfNyIR6vE6YXtqArPGw.cache +0 -1
  110. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/MB/MBWRxa9S470ee8suxVKp0jYgv6K6FQOqKGV0kPGQNMs.cache +0 -1
  111. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Ph/Ph7RtH_NvG2I8XpTa8mA8SBQXZDzBPVIh4CH6g7OXJ0.cache +0 -2
  112. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/So/So59ksdx2dw-_A3-zFZ6Palr7fROjm7_0JDZb04temw.cache +0 -0
  113. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Wt/WtXL_iDofLeTH_v0Yf3PM421r9b1V0g-VBvMPeu9KA0.cache +0 -0
  114. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/dX/dX6FDdUIy8yBCOoaoXcjf71rX9N_bpiXGJ4Urt32NTk.cache +0 -0
  115. data/spec/factories.rb +0 -30
  116. data/spec/grape/grape_integration_spec.rb +0 -137
  117. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  118. data/spec/lib/config_spec.rb +0 -824
  119. data/spec/lib/doorkeeper_spec.rb +0 -27
  120. data/spec/lib/models/expirable_spec.rb +0 -61
  121. data/spec/lib/models/reusable_spec.rb +0 -40
  122. data/spec/lib/models/revocable_spec.rb +0 -55
  123. data/spec/lib/models/scopes_spec.rb +0 -61
  124. data/spec/lib/models/secret_storable_spec.rb +0 -136
  125. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -35
  126. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -180
  127. data/spec/lib/oauth/base_request_spec.rb +0 -210
  128. data/spec/lib/oauth/base_response_spec.rb +0 -45
  129. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  130. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -135
  131. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -110
  132. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -92
  133. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  134. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -105
  135. data/spec/lib/oauth/client_spec.rb +0 -38
  136. data/spec/lib/oauth/code_request_spec.rb +0 -46
  137. data/spec/lib/oauth/code_response_spec.rb +0 -36
  138. data/spec/lib/oauth/error_response_spec.rb +0 -65
  139. data/spec/lib/oauth/error_spec.rb +0 -21
  140. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -20
  141. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -110
  142. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  143. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -262
  144. data/spec/lib/oauth/invalid_request_response_spec.rb +0 -73
  145. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -53
  146. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -202
  147. data/spec/lib/oauth/pre_authorization_spec.rb +0 -230
  148. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -166
  149. data/spec/lib/oauth/scopes_spec.rb +0 -146
  150. data/spec/lib/oauth/token_request_spec.rb +0 -164
  151. data/spec/lib/oauth/token_response_spec.rb +0 -84
  152. data/spec/lib/oauth/token_spec.rb +0 -156
  153. data/spec/lib/option_spec.rb +0 -51
  154. data/spec/lib/request/strategy_spec.rb +0 -51
  155. data/spec/lib/secret_storing/base_spec.rb +0 -61
  156. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -50
  157. data/spec/lib/secret_storing/plain_spec.rb +0 -45
  158. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -49
  159. data/spec/models/doorkeeper/access_grant_spec.rb +0 -173
  160. data/spec/models/doorkeeper/access_token_spec.rb +0 -644
  161. data/spec/models/doorkeeper/application_spec.rb +0 -499
  162. data/spec/requests/applications/applications_request_spec.rb +0 -257
  163. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  164. data/spec/requests/endpoints/authorization_spec.rb +0 -91
  165. data/spec/requests/endpoints/token_spec.rb +0 -85
  166. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -86
  167. data/spec/requests/flows/authorization_code_spec.rb +0 -559
  168. data/spec/requests/flows/client_credentials_spec.rb +0 -219
  169. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -46
  170. data/spec/requests/flows/implicit_grant_spec.rb +0 -91
  171. data/spec/requests/flows/password_spec.rb +0 -356
  172. data/spec/requests/flows/refresh_token_spec.rb +0 -255
  173. data/spec/requests/flows/revoke_token_spec.rb +0 -196
  174. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  175. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  176. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  177. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  178. data/spec/routing/default_routes_spec.rb +0 -41
  179. data/spec/routing/scoped_routes_spec.rb +0 -47
  180. data/spec/spec_helper.rb +0 -54
  181. data/spec/spec_helper_integration.rb +0 -4
  182. data/spec/support/dependencies/factory_bot.rb +0 -4
  183. data/spec/support/helpers/access_token_request_helper.rb +0 -14
  184. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  185. data/spec/support/helpers/config_helper.rb +0 -11
  186. data/spec/support/helpers/model_helper.rb +0 -78
  187. data/spec/support/helpers/request_spec_helper.rb +0 -98
  188. data/spec/support/helpers/url_helper.rb +0 -62
  189. data/spec/support/orm/active_record.rb +0 -5
  190. data/spec/support/shared/controllers_shared_context.rb +0 -100
  191. data/spec/support/shared/hashing_shared_context.rb +0 -40
  192. data/spec/support/shared/models_shared_examples.rb +0 -56
@@ -1,196 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe "Revoke Token Flow" do
6
- before do
7
- Doorkeeper.configure { orm DOORKEEPER_ORM }
8
- end
9
-
10
- let(:private_client_application) { FactoryBot.create :application }
11
- let(:public_client_application) { FactoryBot.create :application, confidential: false }
12
- let(:resource_owner) { User.create!(name: "John", password: "sekret") }
13
-
14
- context "with authenticated, confidential OAuth 2.0 client/application" do
15
- let(:access_token) do
16
- FactoryBot.create(
17
- :access_token,
18
- application: private_client_application,
19
- resource_owner_id: resource_owner.id,
20
- resource_owner_type: resource_owner.class.name,
21
- use_refresh_token: true,
22
- )
23
- end
24
-
25
- let(:headers) do
26
- client_id = private_client_application.uid
27
- client_secret = private_client_application.secret
28
- credentials = Base64.encode64("#{client_id}:#{client_secret}")
29
- { "HTTP_AUTHORIZATION" => "Basic #{credentials}" }
30
- end
31
-
32
- it "revokes the access token provided" do
33
- post revocation_token_endpoint_url, params: { token: access_token.token }, headers: headers
34
-
35
- expect(response).to be_successful
36
- expect(access_token.reload).to be_revoked
37
- end
38
-
39
- it "revokes the refresh token provided" do
40
- post revocation_token_endpoint_url, params: { token: access_token.refresh_token }, headers: headers
41
-
42
- expect(response).to be_successful
43
- expect(access_token.reload).to be_revoked
44
- end
45
-
46
- context "with invalid token to revoke" do
47
- it "does not revoke any tokens and must respond with success" do
48
- expect do
49
- post revocation_token_endpoint_url,
50
- params: { token: "I_AM_AN_INVALID_TOKEN" },
51
- headers: headers
52
- end.not_to(change { Doorkeeper::AccessToken.where(revoked_at: nil).count })
53
-
54
- expect(response).to be_successful
55
- end
56
- end
57
-
58
- context "with bad credentials and a valid token" do
59
- let(:headers) do
60
- client_id = private_client_application.uid
61
- credentials = Base64.encode64("#{client_id}:poop")
62
- { "HTTP_AUTHORIZATION" => "Basic #{credentials}" }
63
- end
64
-
65
- it "does not revoke any tokens and respond with forbidden" do
66
- post revocation_token_endpoint_url, params: { token: access_token.token }, headers: headers
67
-
68
- expect(response).to be_forbidden
69
- expect(response.body).to include("unauthorized_client")
70
- expect(response.body).to include(I18n.t("doorkeeper.errors.messages.revoke.unauthorized"))
71
- expect(access_token.reload).not_to be_revoked
72
- end
73
- end
74
-
75
- context "with no credentials and a valid token" do
76
- it "does not revoke any tokens and respond with forbidden" do
77
- post revocation_token_endpoint_url, params: { token: access_token.token }
78
-
79
- expect(response).to be_forbidden
80
- expect(response.body).to include("unauthorized_client")
81
- expect(response.body).to include(I18n.t("doorkeeper.errors.messages.revoke.unauthorized"))
82
- expect(access_token.reload).not_to be_revoked
83
- end
84
- end
85
-
86
- context "with valid token for another client application" do
87
- let(:other_client_application) { FactoryBot.create :application }
88
- let(:headers) do
89
- client_id = other_client_application.uid
90
- client_secret = other_client_application.secret
91
- credentials = Base64.encode64("#{client_id}:#{client_secret}")
92
- { "HTTP_AUTHORIZATION" => "Basic #{credentials}" }
93
- end
94
-
95
- it "does not revoke the token as it's unauthorized" do
96
- post revocation_token_endpoint_url, params: { token: access_token.token }, headers: headers
97
-
98
- expect(response).to be_forbidden
99
- expect(response.body).to include("unauthorized_client")
100
- expect(response.body).to include(I18n.t("doorkeeper.errors.messages.revoke.unauthorized"))
101
- expect(access_token.reload).not_to be_revoked
102
- end
103
- end
104
- end
105
-
106
- context "with authenticated public OAuth 2.0 client/application" do
107
- let(:access_token) do
108
- FactoryBot.create(
109
- :access_token,
110
- application: nil,
111
- resource_owner_id: resource_owner.id,
112
- resource_owner_type: resource_owner.class.name,
113
- use_refresh_token: true,
114
- )
115
- end
116
-
117
- it "revokes the access token provided" do
118
- post revocation_token_endpoint_url,
119
- params: { client_id: public_client_application.uid, token: access_token.token },
120
- headers: headers
121
-
122
- expect(response).to be_successful
123
- expect(access_token.reload).to be_revoked
124
- end
125
-
126
- it "revokes the refresh token provided" do
127
- post revocation_token_endpoint_url,
128
- params: { client_id: public_client_application.uid, token: access_token.refresh_token },
129
- headers: headers
130
-
131
- expect(response).to be_successful
132
- expect(access_token.reload).to be_revoked
133
- end
134
-
135
- it "responses with success even for invalid token" do
136
- post revocation_token_endpoint_url,
137
- params: { client_id: public_client_application.uid, token: "dont_exist" },
138
- headers: headers
139
-
140
- expect(response).to be_successful
141
- end
142
-
143
- context "with a valid token issued for a confidential client" do
144
- let(:access_token) do
145
- FactoryBot.create(
146
- :access_token,
147
- application: private_client_application,
148
- resource_owner_id: resource_owner.id,
149
- resource_owner_type: resource_owner.class.name,
150
- use_refresh_token: true,
151
- )
152
- end
153
-
154
- it "does not revoke the access token provided" do
155
- post revocation_token_endpoint_url,
156
- params: { client_id: public_client_application.uid, token: access_token.token }
157
-
158
- expect(response).to be_forbidden
159
- expect(response.body).to include("unauthorized_client")
160
- expect(response.body).to include(I18n.t("doorkeeper.errors.messages.revoke.unauthorized"))
161
- expect(access_token.reload).not_to be_revoked
162
- end
163
-
164
- it "does not revoke the refresh token provided" do
165
- post revocation_token_endpoint_url,
166
- params: { client_id: public_client_application.uid, token: access_token.refresh_token }
167
-
168
- expect(response).to be_forbidden
169
- expect(response.body).to include("unauthorized_client")
170
- expect(response.body).to include(I18n.t("doorkeeper.errors.messages.revoke.unauthorized"))
171
- expect(access_token.reload).not_to be_revoked
172
- end
173
- end
174
- end
175
-
176
- context "without client authentication" do
177
- let(:access_token) do
178
- FactoryBot.create(
179
- :access_token,
180
- application: nil,
181
- resource_owner_id: resource_owner.id,
182
- resource_owner_type: resource_owner.class.name,
183
- use_refresh_token: true,
184
- )
185
- end
186
-
187
- it "does not remove the token and responses with an error" do
188
- post revocation_token_endpoint_url,
189
- params: { token: access_token.token },
190
- headers: headers
191
-
192
- expect(response).not_to be_successful
193
- expect(access_token.reload).not_to be_revoked
194
- end
195
- end
196
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- feature "Skip authorization form" do
6
- background do
7
- config_is_set(:authenticate_resource_owner) { User.first || redirect_to("/sign_in") }
8
- client_exists
9
- default_scopes_exist :public
10
- optional_scopes_exist :write
11
- end
12
-
13
- context "with previously authorized clients" do
14
- background do
15
- create_resource_owner
16
- sign_in
17
- end
18
-
19
- scenario "skips the authorization and return a new grant code" do
20
- client_is_authorized(@client, @resource_owner, scopes: "public")
21
- visit authorization_endpoint_url(client: @client, scope: "public")
22
-
23
- i_should_not_see "Authorize"
24
- client_should_be_authorized @client
25
- i_should_be_on_client_callback @client
26
- url_should_have_param "code", Doorkeeper::AccessGrant.first.token
27
- end
28
-
29
- scenario "skips the authorization if other scopes are not requested" do
30
- client_exists scopes: "public read write"
31
- client_is_authorized(@client, @resource_owner, scopes: "public")
32
- visit authorization_endpoint_url(client: @client, scope: "public")
33
-
34
- i_should_not_see "Authorize"
35
- client_should_be_authorized @client
36
- i_should_be_on_client_callback @client
37
- url_should_have_param "code", Doorkeeper::AccessGrant.first.token
38
- end
39
-
40
- scenario "does not skip authorization when scopes differ (new request has fewer scopes)" do
41
- client_is_authorized(@client, @resource_owner, scopes: "public write")
42
- visit authorization_endpoint_url(client: @client, scope: "public")
43
- i_should_see "Authorize"
44
- end
45
-
46
- scenario "does not skip authorization when scopes differ (new request has more scopes)" do
47
- client_is_authorized(@client, @resource_owner, scopes: "public write")
48
- visit authorization_endpoint_url(client: @client, scopes: "public write email")
49
- i_should_see "Authorize"
50
- end
51
-
52
- scenario "creates grant with new scope when scopes differ" do
53
- client_is_authorized(@client, @resource_owner, scopes: "public write")
54
- visit authorization_endpoint_url(client: @client, scope: "public")
55
- click_on "Authorize"
56
- access_grant_should_have_scopes :public
57
- end
58
-
59
- scenario "creates grant with new scope when scopes are greater" do
60
- client_is_authorized(@client, @resource_owner, scopes: "public")
61
- visit authorization_endpoint_url(client: @client, scope: "public write")
62
- click_on "Authorize"
63
- access_grant_should_have_scopes :public, :write
64
- end
65
- end
66
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe "ActionController::Metal API" do
6
- before do
7
- @client = FactoryBot.create(:application)
8
- @resource = User.create!(name: "Joe", password: "sekret")
9
- @token = client_is_authorized(@client, @resource)
10
- end
11
-
12
- it "client requests protected resource with valid token" do
13
- get "/metal.json?access_token=#{@token.token}"
14
- expect(json_response).to include("ok" => true)
15
- end
16
- end
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- feature "Private API" do
6
- background do
7
- @client = FactoryBot.create(:application)
8
- @resource = User.create!(name: "Joe", password: "sekret")
9
- @token = client_is_authorized(@client, @resource)
10
- end
11
-
12
- scenario "client requests protected resource with valid token" do
13
- with_access_token_header @token.token
14
- visit "/full_protected_resources"
15
- expect(page.body).to have_content("index")
16
- end
17
-
18
- scenario "client requests protected resource with disabled header authentication" do
19
- config_is_set :access_token_methods, [:from_access_token_param]
20
- with_access_token_header @token.token
21
- visit "/full_protected_resources"
22
- response_status_should_be 401
23
- end
24
-
25
- scenario "client attempts to request protected resource with invalid token" do
26
- with_access_token_header "invalid"
27
- visit "/full_protected_resources"
28
- response_status_should_be 401
29
- end
30
-
31
- scenario "client attempts to request protected resource with expired token" do
32
- @token.update_attribute :expires_in, -100 # expires token
33
- with_access_token_header @token.token
34
- visit "/full_protected_resources"
35
- response_status_should_be 401
36
- end
37
-
38
- scenario "client requests protected resource with permanent token" do
39
- @token.update_attribute :expires_in, nil # never expires
40
- with_access_token_header @token.token
41
- visit "/full_protected_resources"
42
- expect(page.body).to have_content("index")
43
- end
44
-
45
- scenario "access token with no default scopes" do
46
- Doorkeeper.configuration.instance_eval do
47
- @default_scopes = Doorkeeper::OAuth::Scopes.from_array([:public])
48
- @scopes = default_scopes + optional_scopes
49
- end
50
- @token.update_attribute :scopes, "dummy"
51
- with_access_token_header @token.token
52
- visit "/full_protected_resources"
53
- response_status_should_be 403
54
- end
55
-
56
- scenario "access token with no allowed scopes" do
57
- @token.update_attribute :scopes, nil
58
- with_access_token_header @token.token
59
- visit "/full_protected_resources/1.json"
60
- response_status_should_be 403
61
- end
62
-
63
- scenario "access token with one of allowed scopes" do
64
- @token.update_attribute :scopes, "admin"
65
- with_access_token_header @token.token
66
- visit "/full_protected_resources/1.json"
67
- expect(page.body).to have_content("show")
68
- end
69
-
70
- scenario "access token with another of allowed scopes" do
71
- @token.update_attribute :scopes, "write"
72
- with_access_token_header @token.token
73
- visit "/full_protected_resources/1.json"
74
- expect(page.body).to have_content("show")
75
- end
76
-
77
- scenario "access token with both allowed scopes" do
78
- @token.update_attribute :scopes, "write admin"
79
- with_access_token_header @token.token
80
- visit "/full_protected_resources/1.json"
81
- expect(page.body).to have_content("show")
82
- end
83
- end
@@ -1,133 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe "Custom controller for routes" do
6
- before :all do
7
- Doorkeeper.configure do
8
- orm DOORKEEPER_ORM
9
- end
10
-
11
- Rails.application.routes.disable_clear_and_finalize = true
12
-
13
- Rails.application.routes.draw do
14
- scope "inner_space" do
15
- use_doorkeeper scope: "scope" do
16
- controllers authorizations: "custom_authorizations",
17
- tokens: "custom_authorizations",
18
- applications: "custom_authorizations",
19
- token_info: "custom_authorizations"
20
-
21
- as authorizations: "custom_auth",
22
- tokens: "custom_token",
23
- token_info: "custom_token_info"
24
- end
25
- end
26
-
27
- scope "space" do
28
- use_doorkeeper do
29
- controllers authorizations: "custom_authorizations",
30
- tokens: "custom_authorizations",
31
- applications: "custom_authorizations",
32
- token_info: "custom_authorizations"
33
-
34
- as authorizations: "custom_auth",
35
- tokens: "custom_token",
36
- token_info: "custom_token_info"
37
- end
38
- end
39
-
40
- scope "outer_space" do
41
- use_doorkeeper do
42
- controllers authorizations: "custom_authorizations",
43
- tokens: "custom_authorizations",
44
- token_info: "custom_authorizations"
45
-
46
- as authorizations: "custom_auth",
47
- tokens: "custom_token",
48
- token_info: "custom_token_info"
49
-
50
- skip_controllers :tokens, :applications, :token_info
51
- end
52
- end
53
- end
54
- end
55
-
56
- after :all do
57
- Rails.application.routes.clear!
58
-
59
- load File.expand_path("../dummy/config/routes.rb", __dir__)
60
- end
61
-
62
- it "GET /inner_space/scope/authorize routes to custom authorizations controller" do
63
- expect(get("/inner_space/scope/authorize")).to route_to("custom_authorizations#new")
64
- end
65
-
66
- it "POST /inner_space/scope/authorize routes to custom authorizations controller" do
67
- expect(post("/inner_space/scope/authorize")).to route_to("custom_authorizations#create")
68
- end
69
-
70
- it "DELETE /inner_space/scope/authorize routes to custom authorizations controller" do
71
- expect(delete("/inner_space/scope/authorize")).to route_to("custom_authorizations#destroy")
72
- end
73
-
74
- it "POST /inner_space/scope/token routes to tokens controller" do
75
- expect(post("/inner_space/scope/token")).to route_to("custom_authorizations#create")
76
- end
77
-
78
- it "GET /inner_space/scope/applications routes to applications controller" do
79
- expect(get("/inner_space/scope/applications")).to route_to("custom_authorizations#index")
80
- end
81
-
82
- it "GET /inner_space/scope/token/info routes to the token_info controller" do
83
- expect(get("/inner_space/scope/token/info")).to route_to("custom_authorizations#show")
84
- end
85
-
86
- it "GET /space/oauth/authorize routes to custom authorizations controller" do
87
- expect(get("/space/oauth/authorize")).to route_to("custom_authorizations#new")
88
- end
89
-
90
- it "POST /space/oauth/authorize routes to custom authorizations controller" do
91
- expect(post("/space/oauth/authorize")).to route_to("custom_authorizations#create")
92
- end
93
-
94
- it "DELETE /space/oauth/authorize routes to custom authorizations controller" do
95
- expect(delete("/space/oauth/authorize")).to route_to("custom_authorizations#destroy")
96
- end
97
-
98
- it "POST /space/oauth/token routes to tokens controller" do
99
- expect(post("/space/oauth/token")).to route_to("custom_authorizations#create")
100
- end
101
-
102
- it "POST /space/oauth/revoke routes to tokens controller" do
103
- expect(post("/space/oauth/revoke")).to route_to("custom_authorizations#revoke")
104
- end
105
-
106
- it "POST /space/oauth/introspect routes to tokens controller" do
107
- expect(post("/space/oauth/introspect")).to route_to("custom_authorizations#introspect")
108
- end
109
-
110
- it "GET /space/oauth/applications routes to applications controller" do
111
- expect(get("/space/oauth/applications")).to route_to("custom_authorizations#index")
112
- end
113
-
114
- it "GET /space/oauth/token/info routes to the token_info controller" do
115
- expect(get("/space/oauth/token/info")).to route_to("custom_authorizations#show")
116
- end
117
-
118
- it "POST /outer_space/oauth/token is not be routable" do
119
- expect(post("/outer_space/oauth/token")).not_to be_routable
120
- end
121
-
122
- it "GET /outer_space/oauth/authorize routes to custom authorizations controller" do
123
- expect(get("/outer_space/oauth/authorize")).to be_routable
124
- end
125
-
126
- it "GET /outer_space/oauth/applications is not routable" do
127
- expect(get("/outer_space/oauth/applications")).not_to be_routable
128
- end
129
-
130
- it "GET /outer_space/oauth/token_info is not routable" do
131
- expect(get("/outer_space/oauth/token/info")).not_to be_routable
132
- end
133
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe "Default routes" do
6
- it "GET /oauth/authorize routes to authorizations controller" do
7
- expect(get("/oauth/authorize")).to route_to("doorkeeper/authorizations#new")
8
- end
9
-
10
- it "POST /oauth/authorize routes to authorizations controller" do
11
- expect(post("/oauth/authorize")).to route_to("doorkeeper/authorizations#create")
12
- end
13
-
14
- it "DELETE /oauth/authorize routes to authorizations controller" do
15
- expect(delete("/oauth/authorize")).to route_to("doorkeeper/authorizations#destroy")
16
- end
17
-
18
- it "POST /oauth/token routes to tokens controller" do
19
- expect(post("/oauth/token")).to route_to("doorkeeper/tokens#create")
20
- end
21
-
22
- it "POST /oauth/revoke routes to tokens controller" do
23
- expect(post("/oauth/revoke")).to route_to("doorkeeper/tokens#revoke")
24
- end
25
-
26
- it "POST /oauth/introspect routes to tokens controller" do
27
- expect(post("/oauth/introspect")).to route_to("doorkeeper/tokens#introspect")
28
- end
29
-
30
- it "GET /oauth/applications routes to applications controller" do
31
- expect(get("/oauth/applications")).to route_to("doorkeeper/applications#index")
32
- end
33
-
34
- it "GET /oauth/authorized_applications routes to authorized applications controller" do
35
- expect(get("/oauth/authorized_applications")).to route_to("doorkeeper/authorized_applications#index")
36
- end
37
-
38
- it "GET /oauth/token/info route to authorized TokenInfo controller" do
39
- expect(get("/oauth/token/info")).to route_to("doorkeeper/token_info#show")
40
- end
41
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe "Scoped routes" do
6
- before :all do
7
- Rails.application.routes.disable_clear_and_finalize = true
8
-
9
- Rails.application.routes.draw do
10
- use_doorkeeper scope: "scope"
11
- end
12
- end
13
-
14
- after :all do
15
- Rails.application.routes.clear!
16
-
17
- load File.expand_path("../dummy/config/routes.rb", __dir__)
18
- end
19
-
20
- it "GET /scope/authorize routes to authorizations controller" do
21
- expect(get("/scope/authorize")).to route_to("doorkeeper/authorizations#new")
22
- end
23
-
24
- it "POST /scope/authorize routes to authorizations controller" do
25
- expect(post("/scope/authorize")).to route_to("doorkeeper/authorizations#create")
26
- end
27
-
28
- it "DELETE /scope/authorize routes to authorizations controller" do
29
- expect(delete("/scope/authorize")).to route_to("doorkeeper/authorizations#destroy")
30
- end
31
-
32
- it "POST /scope/token routes to tokens controller" do
33
- expect(post("/scope/token")).to route_to("doorkeeper/tokens#create")
34
- end
35
-
36
- it "GET /scope/applications routes to applications controller" do
37
- expect(get("/scope/applications")).to route_to("doorkeeper/applications#index")
38
- end
39
-
40
- it "GET /scope/authorized_applications routes to authorized applications controller" do
41
- expect(get("/scope/authorized_applications")).to route_to("doorkeeper/authorized_applications#index")
42
- end
43
-
44
- it "GET /scope/token/info route to authorized TokenInfo controller" do
45
- expect(get("/scope/token/info")).to route_to("doorkeeper/token_info#show")
46
- end
47
- end
data/spec/spec_helper.rb DELETED
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "coveralls"
4
-
5
- Coveralls.wear!("rails") do
6
- add_filter("/spec/")
7
- add_filter("/lib/generators/doorkeeper/templates/")
8
- end
9
-
10
- ENV["RAILS_ENV"] ||= "test"
11
-
12
- $LOAD_PATH.unshift File.dirname(__FILE__)
13
-
14
- require "#{File.dirname(__FILE__)}/support/doorkeeper_rspec.rb"
15
-
16
- DOORKEEPER_ORM = Doorkeeper::RSpec.detect_orm
17
-
18
- require "dummy/config/environment"
19
- require "rspec/rails"
20
- require "capybara/rspec"
21
- require "database_cleaner"
22
- require "generator_spec/test_case"
23
-
24
- # Load JRuby SQLite3 if in that platform
25
- if defined? JRUBY_VERSION
26
- require "jdbc/sqlite3"
27
- Jdbc::SQLite3.load_driver
28
- end
29
-
30
- Doorkeeper::RSpec.print_configuration_info
31
-
32
- require "support/orm/#{DOORKEEPER_ORM}"
33
-
34
- Dir["#{File.dirname(__FILE__)}/support/{dependencies,helpers,shared}/*.rb"].sort.each { |file| require file }
35
-
36
- RSpec.configure do |config|
37
- config.infer_spec_type_from_file_location!
38
- config.mock_with :rspec
39
-
40
- config.infer_base_class_for_anonymous_controllers = false
41
-
42
- config.include RSpec::Rails::RequestExampleGroup, type: :request
43
-
44
- config.before do
45
- DatabaseCleaner.start
46
- Doorkeeper.configure { orm DOORKEEPER_ORM }
47
- end
48
-
49
- config.after do
50
- DatabaseCleaner.clean
51
- end
52
-
53
- config.order = "random"
54
- end
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # For compatibility only
4
- require "spec_helper"
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "factory_bot"
4
- FactoryBot.find_definitions
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AccessTokenRequestHelper
4
- def client_is_authorized(client, resource_owner, access_token_attributes = {})
5
- attributes = {
6
- application: client,
7
- resource_owner_id: resource_owner.id,
8
- resource_owner_type: resource_owner.class.name,
9
- }.merge(access_token_attributes)
10
- FactoryBot.create(:access_token, attributes)
11
- end
12
- end
13
-
14
- RSpec.configuration.send :include, AccessTokenRequestHelper