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,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper do
6
- describe "#authenticate" do
7
- let(:request) { double }
8
-
9
- it "calls OAuth::Token#authenticate" do
10
- token_strategies = described_class.config.access_token_methods
11
-
12
- expect(Doorkeeper::OAuth::Token).to receive(:authenticate)
13
- .with(request, *token_strategies)
14
-
15
- described_class.authenticate(request)
16
- end
17
-
18
- it "accepts custom token strategies" do
19
- token_strategies = %i[first_way second_way]
20
-
21
- expect(Doorkeeper::OAuth::Token).to receive(:authenticate)
22
- .with(request, *token_strategies)
23
-
24
- described_class.authenticate(request, token_strategies)
25
- end
26
- end
27
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::Models::Expirable do
6
- subject do
7
- Class.new do
8
- include Doorkeeper::Models::Expirable
9
- end.new
10
- end
11
-
12
- before do
13
- allow(subject).to receive(:created_at).and_return(1.minute.ago)
14
- end
15
-
16
- describe "#expired?" do
17
- it "is not expired if time has not passed" do
18
- allow(subject).to receive(:expires_in).and_return(2.minutes)
19
- expect(subject).not_to be_expired
20
- end
21
-
22
- it "is expired if time has passed" do
23
- allow(subject).to receive(:expires_in).and_return(10.seconds)
24
- expect(subject).to be_expired
25
- end
26
-
27
- it "is not expired if expires_in is not set" do
28
- allow(subject).to receive(:expires_in).and_return(nil)
29
- expect(subject).not_to be_expired
30
- end
31
- end
32
-
33
- describe "#expires_in_seconds" do
34
- it "returns the amount of time remaining until the token is expired" do
35
- allow(subject).to receive(:expires_in).and_return(2.minutes)
36
- expect(subject.expires_in_seconds).to eq(60)
37
- end
38
-
39
- it "returns 0 when expired" do
40
- allow(subject).to receive(:expires_in).and_return(30.seconds)
41
- expect(subject.expires_in_seconds).to eq(0)
42
- end
43
-
44
- it "returns nil when expires_in is nil" do
45
- allow(subject).to receive(:expires_in).and_return(nil)
46
- expect(subject.expires_in_seconds).to be_nil
47
- end
48
- end
49
-
50
- describe "#expires_at" do
51
- it "returns the expiration time of the token" do
52
- allow(subject).to receive(:expires_in).and_return(2.minutes)
53
- expect(subject.expires_at).to be_a(Time)
54
- end
55
-
56
- it "returns nil when expires_in is nil" do
57
- allow(subject).to receive(:expires_in).and_return(nil)
58
- expect(subject.expires_at).to be_nil
59
- end
60
- end
61
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::Models::Reusable do
6
- subject do
7
- Class.new do
8
- include Doorkeeper::Models::Reusable
9
- end.new
10
- end
11
-
12
- describe "#reusable?" do
13
- it "is reusable if its expires_in is nil" do
14
- allow(subject).to receive(:expired?).and_return(false)
15
- allow(subject).to receive(:expires_in).and_return(nil)
16
- expect(subject).to be_reusable
17
- end
18
-
19
- it "is reusable if its expiry has crossed reusable limit" do
20
- allow(subject).to receive(:expired?).and_return(false)
21
- allow(Doorkeeper.configuration).to receive(:token_reuse_limit).and_return(90)
22
- allow(subject).to receive(:expires_in).and_return(100.seconds)
23
- allow(subject).to receive(:expires_in_seconds).and_return(20.seconds)
24
- expect(subject).to be_reusable
25
- end
26
-
27
- it "is not reusable if its expiry has crossed reusable limit" do
28
- allow(subject).to receive(:expired?).and_return(false)
29
- allow(Doorkeeper.configuration).to receive(:token_reuse_limit).and_return(90)
30
- allow(subject).to receive(:expires_in).and_return(100.seconds)
31
- allow(subject).to receive(:expires_in_seconds).and_return(5.seconds)
32
- expect(subject).not_to be_reusable
33
- end
34
-
35
- it "is not reusable if it is already expired" do
36
- allow(subject).to receive(:expired?).and_return(true)
37
- expect(subject).not_to be_reusable
38
- end
39
- end
40
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::Models::Revocable do
6
- subject do
7
- Class.new do
8
- include Doorkeeper::Models::Revocable
9
- end.new
10
- end
11
-
12
- describe "#revoke" do
13
- it "updates :revoked_at attribute with current time" do
14
- utc = double utc: double
15
- clock = double now: utc
16
- expect(subject).to receive(:update_column).with(:revoked_at, clock.now.utc)
17
- subject.revoke(clock)
18
- end
19
- end
20
-
21
- describe "#revoked?" do
22
- it "is revoked if :revoked_at has passed" do
23
- allow(subject).to receive(:revoked_at).and_return(Time.now.utc - 1000)
24
- expect(subject).to be_revoked
25
- end
26
-
27
- it "is not revoked if :revoked_at has not passed" do
28
- allow(subject).to receive(:revoked_at).and_return(Time.now.utc + 1000)
29
- expect(subject).not_to be_revoked
30
- end
31
-
32
- it "is not revoked if :revoked_at is not set" do
33
- allow(subject).to receive(:revoked_at).and_return(nil)
34
- expect(subject).not_to be_revoked
35
- end
36
- end
37
-
38
- describe "#revoke_previous_refresh_token!" do
39
- it "revokes the previous token if exists and resets the `previous_refresh_token` attribute" do
40
- previous_token = FactoryBot.create(
41
- :access_token,
42
- refresh_token: "refresh_token",
43
- )
44
- current_token = FactoryBot.create(
45
- :access_token,
46
- previous_refresh_token: previous_token.refresh_token,
47
- )
48
-
49
- current_token.revoke_previous_refresh_token!
50
-
51
- expect(current_token.previous_refresh_token).to be_empty
52
- expect(previous_token.reload).to be_revoked
53
- end
54
- end
55
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::Models::Scopes do
6
- subject do
7
- Class.new(Struct.new(:scopes)) do
8
- include Doorkeeper::Models::Scopes
9
- end.new
10
- end
11
-
12
- before do
13
- subject[:scopes] = "public admin"
14
- end
15
-
16
- describe "#scopes" do
17
- it "is a `Scopes` class" do
18
- expect(subject.scopes).to be_a(Doorkeeper::OAuth::Scopes)
19
- end
20
-
21
- it "includes scopes" do
22
- expect(subject.scopes).to include("public")
23
- end
24
- end
25
-
26
- describe "#scopes=" do
27
- it "accepts String" do
28
- subject.scopes = "private admin"
29
- expect(subject.scopes_string).to eq("private admin")
30
- end
31
-
32
- it "accepts Array" do
33
- subject.scopes = %w[private admin]
34
- expect(subject.scopes_string).to eq("private admin")
35
- end
36
-
37
- it "ignores duplicated scopes" do
38
- subject.scopes = %w[private admin admin]
39
- expect(subject.scopes_string).to eq("private admin")
40
-
41
- subject.scopes = "private admin admin"
42
- expect(subject.scopes_string).to eq("private admin")
43
- end
44
- end
45
-
46
- describe "#scopes_string" do
47
- it "is a `Scopes` class" do
48
- expect(subject.scopes_string).to eq("public admin")
49
- end
50
- end
51
-
52
- describe "#includes_scope?" do
53
- it "returns true if at least one scope is included" do
54
- expect(subject.includes_scope?("public", "private")).to be true
55
- end
56
-
57
- it "returns false if no scopes are included" do
58
- expect(subject.includes_scope?("teacher", "student")).to be false
59
- end
60
- end
61
- end
@@ -1,136 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::Models::SecretStorable do
6
- let(:clazz) do
7
- Class.new do
8
- include Doorkeeper::Models::SecretStorable
9
-
10
- def self.find_by(*)
11
- raise "stub this"
12
- end
13
-
14
- def update_column(*)
15
- raise "stub this"
16
- end
17
-
18
- def token
19
- raise "stub this"
20
- end
21
- end
22
- end
23
- let(:strategy) { clazz.secret_strategy }
24
-
25
- describe ".find_by_plaintext_token" do
26
- subject { clazz.send(:find_by_plaintext_token, "attr", "input") }
27
-
28
- it "forwards to the secret_strategy" do
29
- expect(strategy)
30
- .to receive(:transform_secret)
31
- .with("input")
32
- .and_return "found"
33
-
34
- expect(clazz)
35
- .to receive(:find_by)
36
- .with("attr" => "found")
37
- .and_return "result"
38
-
39
- expect(subject).to eq "result"
40
- end
41
-
42
- it "calls find_by_fallback_token if not found" do
43
- expect(clazz)
44
- .to receive(:find_by)
45
- .with("attr" => "input")
46
- .and_return nil
47
-
48
- expect(clazz)
49
- .to receive(:find_by_fallback_token)
50
- .with("attr", "input")
51
- .and_return "fallback"
52
-
53
- expect(subject).to eq "fallback"
54
- end
55
- end
56
-
57
- describe ".find_by_fallback_token" do
58
- subject { clazz.send(:find_by_fallback_token, "attr", "input") }
59
-
60
- let(:fallback) { double(::Doorkeeper::SecretStoring::Plain) }
61
-
62
- it "returns nil if none defined" do
63
- expect(clazz.fallback_secret_strategy).to eq nil
64
- expect(subject).to eq nil
65
- end
66
-
67
- context "when a fallback strategy is defined" do
68
- before do
69
- allow(clazz).to receive(:fallback_secret_strategy).and_return(fallback)
70
- end
71
-
72
- context "when resource is defined" do
73
- let(:resource) { double("Token model") }
74
-
75
- it "calls the strategy for lookup" do
76
- expect(clazz)
77
- .to receive(:find_by)
78
- .with("attr" => "fallback")
79
- .and_return(resource)
80
-
81
- expect(fallback)
82
- .to receive(:transform_secret)
83
- .with("input")
84
- .and_return("fallback")
85
-
86
- # store_secret will call the resource
87
- expect(resource)
88
- .to receive(:attr=)
89
- .with("new value")
90
-
91
- # It will upgrade the secret automtically using the current strategy
92
- expect(strategy)
93
- .to receive(:transform_secret)
94
- .with("input")
95
- .and_return("new value")
96
-
97
- expect(resource).to receive(:update).with("attr" => "new value")
98
- expect(subject).to eq resource
99
- end
100
- end
101
-
102
- context "when resource is not defined" do
103
- before do
104
- allow(clazz).to receive(:fallback_secret_strategy).and_return(fallback)
105
- end
106
-
107
- it "returns nil" do
108
- expect(clazz)
109
- .to receive(:find_by)
110
- .with("attr" => "fallback")
111
- .and_return(nil)
112
-
113
- expect(fallback)
114
- .to receive(:transform_secret)
115
- .with("input")
116
- .and_return("fallback")
117
-
118
- # It does not find a token even with the fallback method
119
- expect(subject).to be_nil
120
- end
121
- end
122
- end
123
- end
124
-
125
- describe ".secret_strategy" do
126
- it "defaults to plain strategy" do
127
- expect(strategy).to eq Doorkeeper::SecretStoring::Plain
128
- end
129
- end
130
-
131
- describe ".fallback_secret_strategy" do
132
- it "defaults to nil" do
133
- expect(clazz.fallback_secret_strategy).to eq nil
134
- end
135
- end
136
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::OAuth::Authorization::URIBuilder do
6
- describe ".uri_with_query" do
7
- it "returns the uri with query" do
8
- uri = described_class.uri_with_query "http://example.com/", parameter: "value"
9
- expect(uri).to eq("http://example.com/?parameter=value")
10
- end
11
-
12
- it "rejects nil values" do
13
- uri = described_class.uri_with_query "http://example.com/", parameter: ""
14
- expect(uri).to eq("http://example.com/?")
15
- end
16
-
17
- it "preserves original query parameters" do
18
- uri = described_class.uri_with_query "http://example.com/?query1=value", parameter: "value"
19
- expect(uri).to match(/query1=value/)
20
- expect(uri).to match(/parameter=value/)
21
- end
22
- end
23
-
24
- describe ".uri_with_fragment" do
25
- it "returns uri with parameters as fragments" do
26
- uri = described_class.uri_with_fragment "http://example.com/", parameter: "value"
27
- expect(uri).to eq("http://example.com/#parameter=value")
28
- end
29
-
30
- it "preserves original query parameters" do
31
- uri = described_class.uri_with_fragment "http://example.com/?query1=value1", parameter: "value"
32
- expect(uri).to eq("http://example.com/?query1=value1#parameter=value")
33
- end
34
- end
35
- end
@@ -1,180 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::OAuth::AuthorizationCodeRequest do
6
- subject do
7
- described_class.new(server, grant, client, params)
8
- end
9
-
10
- let(:server) do
11
- double :server,
12
- access_token_expires_in: 2.days,
13
- refresh_token_enabled?: false,
14
- custom_access_token_expires_in: lambda { |context|
15
- context.grant_type == Doorkeeper::OAuth::AUTHORIZATION_CODE ? 1234 : nil
16
- }
17
- end
18
-
19
- let(:resource_owner) { FactoryBot.create :resource_owner }
20
- let(:grant) do
21
- FactoryBot.create :access_grant,
22
- resource_owner_id: resource_owner.id,
23
- resource_owner_type: resource_owner.class.name
24
- end
25
- let(:client) { grant.application }
26
- let(:redirect_uri) { client.redirect_uri }
27
- let(:params) { { redirect_uri: redirect_uri } }
28
-
29
- before do
30
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
31
- end
32
-
33
- it "issues a new token for the client" do
34
- expect do
35
- subject.authorize
36
- end.to change { client.reload.access_tokens.count }.by(1)
37
-
38
- expect(client.reload.access_tokens.max_by(&:created_at).expires_in).to eq(1234)
39
- end
40
-
41
- it "issues the token with same grant's scopes" do
42
- subject.authorize
43
- expect(Doorkeeper::AccessToken.last.scopes).to eq(grant.scopes)
44
- end
45
-
46
- it "revokes the grant" do
47
- expect { subject.authorize }.to(change { grant.reload.accessible? })
48
- end
49
-
50
- it "requires the grant to be accessible" do
51
- grant.revoke
52
- subject.validate
53
- expect(subject.error).to eq(:invalid_grant)
54
- end
55
-
56
- it "requires the grant" do
57
- subject = described_class.new(server, nil, client, params)
58
- subject.validate
59
- expect(subject.error).to eq(:invalid_grant)
60
- end
61
-
62
- it "requires the client" do
63
- subject = described_class.new(server, grant, nil, params)
64
- subject.validate
65
- expect(subject.error).to eq(:invalid_client)
66
- end
67
-
68
- it "requires the redirect_uri" do
69
- subject = described_class.new(server, grant, nil, params.except(:redirect_uri))
70
- subject.validate
71
- expect(subject.error).to eq(:invalid_request)
72
- expect(subject.missing_param).to eq(:redirect_uri)
73
- end
74
-
75
- it "invalid code_verifier param because server does not support pkce" do
76
- allow(Doorkeeper::AccessGrant).to receive(:pkce_supported?).and_return(false)
77
- code_verifier = "a45a9fea-0676-477e-95b1-a40f72ac3cfb"
78
- subject = described_class.new(server, grant, client, params.merge(code_verifier: code_verifier))
79
- subject.validate
80
- expect(subject.error).to eq(:invalid_request)
81
- expect(subject.invalid_request_reason).to eq(:not_support_pkce)
82
- end
83
-
84
- it "matches the redirect_uri with grant's one" do
85
- subject = described_class.new(server, grant, client, params.merge(redirect_uri: "http://other.com"))
86
- subject.validate
87
- expect(subject.error).to eq(:invalid_grant)
88
- end
89
-
90
- it "matches the client with grant's one" do
91
- other_client = FactoryBot.create :application
92
- subject = described_class.new(server, grant, other_client, params)
93
- subject.validate
94
- expect(subject.error).to eq(:invalid_grant)
95
- end
96
-
97
- it "skips token creation if there is a matching one reusable" do
98
- scopes = grant.scopes
99
-
100
- Doorkeeper.configure do
101
- orm DOORKEEPER_ORM
102
- reuse_access_token
103
- default_scopes(*scopes)
104
- end
105
-
106
- FactoryBot.create(
107
- :access_token,
108
- application_id: client.id,
109
- resource_owner_id: grant.resource_owner_id,
110
- resource_owner_type: grant.resource_owner_type,
111
- scopes: grant.scopes.to_s,
112
- )
113
-
114
- expect { subject.authorize }.not_to(change { Doorkeeper::AccessToken.count })
115
- end
116
-
117
- it "creates token if there is a matching one but non reusable" do
118
- scopes = grant.scopes
119
-
120
- Doorkeeper.configure do
121
- orm DOORKEEPER_ORM
122
- reuse_access_token
123
- default_scopes(*scopes)
124
- end
125
-
126
- FactoryBot.create(
127
- :access_token,
128
- application_id: client.id,
129
- resource_owner_id: grant.resource_owner_id,
130
- resource_owner_type: grant.resource_owner_type,
131
- scopes: grant.scopes.to_s,
132
- )
133
-
134
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:reusable?).and_return(false)
135
-
136
- expect { subject.authorize }.to change { Doorkeeper::AccessToken.count }.by(1)
137
- end
138
-
139
- it "calls configured request callback methods" do
140
- expect(Doorkeeper.configuration.before_successful_strategy_response)
141
- .to receive(:call).with(subject).once
142
- expect(Doorkeeper.configuration.after_successful_strategy_response)
143
- .to receive(:call).with(subject, instance_of(Doorkeeper::OAuth::TokenResponse)).once
144
-
145
- subject.authorize
146
- end
147
-
148
- context "when redirect_uri contains some query params" do
149
- let(:redirect_uri) { client.redirect_uri + "?query=q" }
150
-
151
- it "compares only host part with grant's redirect_uri" do
152
- subject.validate
153
- expect(subject.error).to eq(nil)
154
- end
155
- end
156
-
157
- context "when redirect_uri is not an URI" do
158
- let(:redirect_uri) { "123d#!s" }
159
-
160
- it "responds with invalid_grant" do
161
- subject.validate
162
- expect(subject.error).to eq(:invalid_grant)
163
- end
164
- end
165
-
166
- context "when redirect_uri is the native one" do
167
- let(:redirect_uri) { "urn:ietf:wg:oauth:2.0:oob" }
168
-
169
- it "invalidates when redirect_uri of the grant is not native" do
170
- subject.validate
171
- expect(subject.error).to eq(:invalid_grant)
172
- end
173
-
174
- it "validates when redirect_uri of the grant is also native" do
175
- allow(grant).to receive(:redirect_uri) { redirect_uri }
176
- subject.validate
177
- expect(subject.error).to eq(nil)
178
- end
179
- end
180
- end