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,257 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- feature "Adding applications in application form" do
6
- background do
7
- i_am_logged_in
8
- visit "/oauth/applications/new"
9
- end
10
-
11
- scenario "adding a valid app" do
12
- fill_in "doorkeeper_application[name]", with: "My Application"
13
- fill_in "doorkeeper_application[redirect_uri]",
14
- with: "https://example.com"
15
-
16
- click_button "Submit"
17
- i_should_see "Application created"
18
- i_should_see "My Application"
19
- end
20
-
21
- scenario "adding invalid app" do
22
- click_button "Submit"
23
- i_should_see "Whoops! Check your form for possible errors"
24
- end
25
-
26
- scenario "adding app ignoring bad scope" do
27
- config_is_set("enforce_configured_scopes", false)
28
-
29
- fill_in "doorkeeper_application[name]", with: "My Application"
30
- fill_in "doorkeeper_application[redirect_uri]",
31
- with: "https://example.com"
32
- fill_in "doorkeeper_application[scopes]", with: "blahblah"
33
-
34
- click_button "Submit"
35
- i_should_see "Application created"
36
- i_should_see "My Application"
37
- end
38
-
39
- scenario "adding app validating bad scope" do
40
- config_is_set("enforce_configured_scopes", true)
41
-
42
- fill_in "doorkeeper_application[name]", with: "My Application"
43
- fill_in "doorkeeper_application[redirect_uri]",
44
- with: "https://example.com"
45
- fill_in "doorkeeper_application[scopes]", with: "blahblah"
46
-
47
- click_button "Submit"
48
- i_should_see "Whoops! Check your form for possible errors"
49
- end
50
-
51
- scenario "adding app validating scope, blank scope is accepted" do
52
- config_is_set("enforce_configured_scopes", true)
53
-
54
- fill_in "doorkeeper_application[name]", with: "My Application"
55
- fill_in "doorkeeper_application[redirect_uri]",
56
- with: "https://example.com"
57
- fill_in "doorkeeper_application[scopes]", with: ""
58
-
59
- click_button "Submit"
60
- i_should_see "Application created"
61
- i_should_see "My Application"
62
- end
63
-
64
- scenario "adding app validating scope, multiple scopes configured" do
65
- config_is_set("enforce_configured_scopes", true)
66
- scopes = Doorkeeper::OAuth::Scopes.from_array(%w[read write admin])
67
- config_is_set("optional_scopes", scopes)
68
-
69
- fill_in "doorkeeper_application[name]", with: "My Application"
70
- fill_in "doorkeeper_application[redirect_uri]",
71
- with: "https://example.com"
72
- fill_in "doorkeeper_application[scopes]", with: "read write"
73
-
74
- click_button "Submit"
75
- i_should_see "Application created"
76
- i_should_see "My Application"
77
- end
78
-
79
- scenario "adding app validating scope, bad scope with multiple scopes configured" do
80
- config_is_set("enforce_configured_scopes", true)
81
- scopes = Doorkeeper::OAuth::Scopes.from_array(%w[read write admin])
82
- config_is_set("optional_scopes", scopes)
83
-
84
- fill_in "doorkeeper_application[name]", with: "My Application"
85
- fill_in "doorkeeper_application[redirect_uri]",
86
- with: "https://example.com"
87
- fill_in "doorkeeper_application[scopes]", with: "read blah"
88
-
89
- click_button "Submit"
90
- i_should_see "Whoops! Check your form for possible errors"
91
- i_should_see Regexp.new(
92
- I18n.t("activerecord.errors.models.doorkeeper/application.attributes.scopes.not_match_configured"),
93
- true,
94
- )
95
- end
96
-
97
- context "with blank redirect URI" do
98
- scenario "adding app with blank redirect URI when configured flows requires redirect uri" do
99
- config_is_set("grant_flows", %w[authorization_code implicit client_credentials])
100
-
101
- fill_in "doorkeeper_application[name]", with: "My Application"
102
- fill_in "doorkeeper_application[redirect_uri]",
103
- with: ""
104
-
105
- click_button "Submit"
106
- i_should_see "Whoops! Check your form for possible errors"
107
- end
108
-
109
- scenario "adding app with blank redirect URI when configured flows without redirect uri" do
110
- config_is_set("grant_flows", %w[client_credentials password])
111
-
112
- # Visit it once again to consider grant flows
113
- visit "/oauth/applications/new"
114
-
115
- i_should_see I18n.t("doorkeeper.applications.help.blank_redirect_uri")
116
-
117
- fill_in "doorkeeper_application[name]", with: "My Application"
118
- fill_in "doorkeeper_application[redirect_uri]",
119
- with: ""
120
-
121
- click_button "Submit"
122
- i_should_see "Application created"
123
- i_should_see "My Application"
124
- end
125
- end
126
- end
127
-
128
- feature "Listing applications" do
129
- background do
130
- i_am_logged_in
131
-
132
- FactoryBot.create :application, name: "Oauth Dude"
133
- FactoryBot.create :application, name: "Awesome App"
134
- end
135
-
136
- scenario "application list" do
137
- visit "/oauth/applications"
138
-
139
- i_should_see "Awesome App"
140
- i_should_see "Oauth Dude"
141
- end
142
- end
143
-
144
- feature "Renders assets" do
145
- scenario "admin stylesheets" do
146
- visit "/assets/doorkeeper/admin/application.css"
147
-
148
- i_should_see "Bootstrap"
149
- i_should_see ".doorkeeper-admin"
150
- end
151
-
152
- scenario "application stylesheets" do
153
- visit "/assets/doorkeeper/application.css"
154
-
155
- i_should_see "Bootstrap"
156
- i_should_see "#oauth-permissions"
157
- i_should_see "#container"
158
- end
159
- end
160
-
161
- feature "Show application" do
162
- given :app do
163
- i_am_logged_in
164
-
165
- FactoryBot.create :application, name: "Just another oauth app"
166
- end
167
-
168
- scenario "visiting application page" do
169
- visit "/oauth/applications/#{app.id}"
170
-
171
- i_should_see "Just another oauth app"
172
- end
173
- end
174
-
175
- feature "Edit application" do
176
- let :app do
177
- FactoryBot.create :application, name: "OMG my app"
178
- end
179
-
180
- background do
181
- i_am_logged_in
182
-
183
- visit "/oauth/applications/#{app.id}/edit"
184
- end
185
-
186
- scenario "updating a valid app" do
187
- fill_in "doorkeeper_application[name]", with: "Serious app"
188
- click_button "Submit"
189
-
190
- i_should_see "Application updated"
191
- i_should_see "Serious app"
192
- i_should_not_see "OMG my app"
193
- end
194
-
195
- scenario "updating an invalid app" do
196
- fill_in "doorkeeper_application[name]", with: ""
197
- click_button "Submit"
198
-
199
- i_should_see "Whoops! Check your form for possible errors"
200
- end
201
- end
202
-
203
- feature "Remove application" do
204
- background do
205
- i_am_logged_in
206
-
207
- @app = FactoryBot.create :application
208
- end
209
-
210
- scenario "deleting an application from list" do
211
- visit "/oauth/applications"
212
-
213
- i_should_see @app.name
214
-
215
- within(:css, "tr#application_#{@app.id}") do
216
- click_button "Destroy"
217
- end
218
-
219
- i_should_see "Application deleted"
220
- i_should_not_see @app.name
221
- end
222
-
223
- scenario "deleting an application from show" do
224
- visit "/oauth/applications/#{@app.id}"
225
- click_button "Destroy"
226
-
227
- i_should_see "Application deleted"
228
- end
229
- end
230
-
231
- context "when admin authenticator block is default" do
232
- let(:app) { FactoryBot.create :application, name: "app" }
233
-
234
- feature "application list" do
235
- scenario "fails with forbidden" do
236
- visit "/oauth/applications"
237
-
238
- should_have_status 403
239
- end
240
- end
241
-
242
- feature "adding an app" do
243
- scenario "fails with forbidden" do
244
- visit "/oauth/applications/new"
245
-
246
- should_have_status 403
247
- end
248
- end
249
-
250
- feature "editing an app" do
251
- scenario "fails with forbidden" do
252
- visit "/oauth/applications/#{app.id}/edit"
253
-
254
- should_have_status 403
255
- end
256
- end
257
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- feature "Authorized applications" do
6
- background do
7
- @user = User.create!(name: "Joe", password: "sekret")
8
- @client = client_exists(name: "Amazing Client App")
9
- resource_owner_is_authenticated @user
10
- client_is_authorized @client, @user
11
- end
12
-
13
- scenario "display user's authorized applications" do
14
- visit "/oauth/authorized_applications"
15
- i_should_see "Amazing Client App"
16
- end
17
-
18
- scenario "do not display other user's authorized applications" do
19
- client = client_exists(name: "Another Client App")
20
- client_is_authorized client, User.create!(name: "Joe", password: "sekret")
21
- visit "/oauth/authorized_applications"
22
- i_should_not_see "Another Client App"
23
- end
24
-
25
- scenario "user revoke access to application" do
26
- visit "/oauth/authorized_applications"
27
- i_should_see "Amazing Client App"
28
- click_on "Revoke"
29
- i_should_see "Application revoked"
30
- i_should_not_see "Amazing Client App"
31
- end
32
- end
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- feature "Authorization endpoint" do
6
- background do
7
- default_scopes_exist :default
8
- config_is_set(:authenticate_resource_owner) { User.first || redirect_to("/sign_in") }
9
- client_exists(name: "MyApp")
10
- end
11
-
12
- scenario "requires resource owner to be authenticated" do
13
- visit authorization_endpoint_url(client: @client)
14
- i_should_see "Sign in"
15
- i_should_be_on "/"
16
- end
17
-
18
- context "with authenticated resource owner" do
19
- background do
20
- create_resource_owner
21
- sign_in
22
- end
23
-
24
- scenario "displays the authorization form" do
25
- visit authorization_endpoint_url(client: @client)
26
- i_should_see "Authorize MyApp to use your account?"
27
- end
28
-
29
- scenario "displays all requested scopes" do
30
- default_scopes_exist :public
31
- optional_scopes_exist :write
32
- visit authorization_endpoint_url(client: @client, scope: "public write")
33
- i_should_see "Access your public data"
34
- i_should_see "Update your data"
35
- end
36
- end
37
-
38
- context "with a invalid request's param" do
39
- background do
40
- create_resource_owner
41
- sign_in
42
- end
43
-
44
- context "when missing required param" do
45
- scenario "displays invalid_request error when missing client" do
46
- visit authorization_endpoint_url(client: nil, response_type: "code")
47
- i_should_not_see "Authorize"
48
- i_should_see_translated_invalid_request_error_message :missing_param, :client_id
49
- end
50
-
51
- scenario "displays invalid_request error when missing response_type param" do
52
- visit authorization_endpoint_url(client: @client, response_type: "")
53
- i_should_not_see "Authorize"
54
- i_should_see_translated_invalid_request_error_message :missing_param, :response_type
55
- end
56
-
57
- scenario "displays invalid_request error when missing scope param and authorization server has no default scopes" do
58
- config_is_set(:default_scopes, [])
59
- visit authorization_endpoint_url(client: @client, response_type: "code", scope: "")
60
- i_should_not_see "Authorize"
61
- i_should_see_translated_invalid_request_error_message :missing_param, :scope
62
- end
63
- end
64
-
65
- scenario "displays unsupported_response_type error when using a disabled response type" do
66
- config_is_set(:grant_flows, ["implicit"])
67
- visit authorization_endpoint_url(client: @client, response_type: "code")
68
- i_should_not_see "Authorize"
69
- i_should_see_translated_error_message :unsupported_response_type
70
- end
71
- end
72
-
73
- context "when forgery protection enabled" do
74
- background do
75
- create_resource_owner
76
- sign_in
77
- end
78
-
79
- scenario "raises exception on forged requests" do
80
- allowing_forgery_protection do
81
- expect do
82
- page.driver.post authorization_endpoint_url(
83
- client_id: @client.uid,
84
- redirect_uri: @client.redirect_uri,
85
- response_type: "code",
86
- )
87
- end.to raise_error(ActionController::InvalidAuthenticityToken)
88
- end
89
- end
90
- end
91
- end
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe "Token endpoint" do
6
- before do
7
- client_exists
8
- create_resource_owner
9
- authorization_code_exists application: @client,
10
- scopes: "public",
11
- resource_owner_id: @resource_owner.id,
12
- resource_owner_type: @resource_owner.class.name
13
- end
14
-
15
- it "respond with correct headers" do
16
- post token_endpoint_url(code: @authorization.token, client: @client)
17
- should_have_header "Pragma", "no-cache"
18
-
19
- # Rails 5.2 changed headers
20
- if ::Rails::VERSION::MAJOR >= 5 && ::Rails::VERSION::MINOR >= 2 || ::Rails::VERSION::MAJOR >= 6
21
- should_have_header "Cache-Control", "private, no-store"
22
- else
23
- should_have_header "Cache-Control", "no-store"
24
- end
25
-
26
- should_have_header "Content-Type", "application/json; charset=utf-8"
27
- end
28
-
29
- it "accepts client credentials with basic auth header" do
30
- post token_endpoint_url,
31
- params: {
32
- code: @authorization.token,
33
- redirect_uri: @client.redirect_uri,
34
- },
35
- headers: { "HTTP_AUTHORIZATION" => basic_auth_header_for_client(@client) }
36
-
37
- expect(json_response).to include("access_token" => Doorkeeper::AccessToken.first.token)
38
- end
39
-
40
- it "returns null for expires_in when a permanent token is set" do
41
- config_is_set(:access_token_expires_in, nil)
42
-
43
- post token_endpoint_url(code: @authorization.token, client: @client)
44
-
45
- expect(json_response).to include("access_token" => Doorkeeper::AccessToken.first.token)
46
- expect(json_response).not_to include("expires_in")
47
- end
48
-
49
- it "returns unsupported_grant_type for invalid grant_type param" do
50
- post token_endpoint_url(code: @authorization.token, client: @client, grant_type: "nothing")
51
-
52
- expect(json_response).to match(
53
- "error" => "unsupported_grant_type",
54
- "error_description" => translated_error_message("unsupported_grant_type"),
55
- )
56
- end
57
-
58
- it "returns unsupported_grant_type for disabled grant flows" do
59
- config_is_set(:grant_flows, ["implicit"])
60
- post token_endpoint_url(code: @authorization.token, client: @client, grant_type: "authorization_code")
61
-
62
- expect(json_response).to match(
63
- "error" => "unsupported_grant_type",
64
- "error_description" => translated_error_message("unsupported_grant_type"),
65
- )
66
- end
67
-
68
- it "returns unsupported_grant_type when refresh_token is not in use" do
69
- post token_endpoint_url(code: @authorization.token, client: @client, grant_type: "refresh_token")
70
-
71
- expect(json_response).to match(
72
- "error" => "unsupported_grant_type",
73
- "error_description" => translated_error_message("unsupported_grant_type"),
74
- )
75
- end
76
-
77
- it "returns invalid_request if grant_type is missing" do
78
- post token_endpoint_url(code: @authorization.token, client: @client, grant_type: "")
79
-
80
- expect(json_response).to match(
81
- "error" => "invalid_request",
82
- "error_description" => translated_invalid_request_error_message(:missing_param, :grant_type),
83
- )
84
- end
85
- end
@@ -1,86 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- feature "Authorization Code Flow Errors" do
6
- let(:client_params) { {} }
7
-
8
- background do
9
- default_scopes_exist :default
10
- config_is_set(:authenticate_resource_owner) { User.first || redirect_to("/sign_in") }
11
- client_exists client_params
12
- create_resource_owner
13
- sign_in
14
- end
15
-
16
- after do
17
- access_grant_should_not_exist
18
- end
19
-
20
- context "with a client trying to xss resource owner" do
21
- let(:client_name) { "<div id='xss'>XSS</div>" }
22
- let(:client_params) { { name: client_name } }
23
-
24
- scenario "resource owner visit authorization endpoint" do
25
- visit authorization_endpoint_url(client: @client)
26
- expect(page).not_to have_css("#xss")
27
- end
28
- end
29
-
30
- context "when access was denied" do
31
- scenario "redirects with error" do
32
- visit authorization_endpoint_url(client: @client)
33
- click_on "Deny"
34
-
35
- i_should_be_on_client_callback @client
36
- url_should_not_have_param "code"
37
- url_should_have_param "error", "access_denied"
38
- url_should_have_param "error_description", translated_error_message(:access_denied)
39
- end
40
-
41
- scenario "redirects with state parameter" do
42
- visit authorization_endpoint_url(client: @client, state: "return-this")
43
- click_on "Deny"
44
-
45
- i_should_be_on_client_callback @client
46
- url_should_not_have_param "code"
47
- url_should_have_param "state", "return-this"
48
- end
49
- end
50
- end
51
-
52
- RSpec.describe "Authorization Code Flow Errors after authorization" do
53
- before do
54
- client_exists
55
- create_resource_owner
56
- authorization_code_exists application: @client,
57
- resource_owner_id: @resource_owner.id,
58
- resource_owner_type: @resource_owner.class.name
59
- end
60
-
61
- it "returns :invalid_grant error when posting an already revoked grant code" do
62
- # First successful request
63
- post token_endpoint_url(code: @authorization.token, client: @client)
64
-
65
- # Second attempt with same token
66
- expect do
67
- post token_endpoint_url(code: @authorization.token, client: @client)
68
- end.not_to(change { Doorkeeper::AccessToken.count })
69
-
70
- expect(json_response).to match(
71
- "error" => "invalid_grant",
72
- "error_description" => translated_error_message("invalid_grant"),
73
- )
74
- end
75
-
76
- it "returns :invalid_grant error for invalid grant code" do
77
- post token_endpoint_url(code: "invalid", client: @client)
78
-
79
- access_token_should_not_exist
80
-
81
- expect(json_response).to match(
82
- "error" => "invalid_grant",
83
- "error_description" => translated_error_message("invalid_grant"),
84
- )
85
- end
86
- end