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,210 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::OAuth::BaseRequest do
6
- subject do
7
- described_class.new
8
- end
9
-
10
- let(:access_token) do
11
- double :access_token,
12
- plaintext_token: "some-token",
13
- expires_in: "3600",
14
- expires_in_seconds: "300",
15
- scopes_string: "two scopes",
16
- plaintext_refresh_token: "some-refresh-token",
17
- token_type: "bearer",
18
- created_at: 0
19
- end
20
-
21
- let(:client) { double :client, id: "1" }
22
-
23
- let(:scopes_array) { %w[public write] }
24
-
25
- let(:server) do
26
- double :server,
27
- access_token_expires_in: 100,
28
- custom_access_token_expires_in: ->(_context) { nil },
29
- refresh_token_enabled?: false
30
- end
31
-
32
- before do
33
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
34
- end
35
-
36
- describe "#authorize" do
37
- before do
38
- allow(subject).to receive(:access_token).and_return(access_token)
39
- end
40
-
41
- it "validates itself" do
42
- expect(subject).to receive(:validate).once
43
- subject.authorize
44
- end
45
-
46
- context "when valid" do
47
- before do
48
- allow(subject).to receive(:valid?).and_return(true)
49
- end
50
-
51
- it "calls callback methods" do
52
- expect(subject).to receive(:before_successful_response).once
53
- expect(subject).to receive(:after_successful_response).once
54
- subject.authorize
55
- end
56
-
57
- it "returns a TokenResponse object" do
58
- result = subject.authorize
59
-
60
- expect(result).to be_an_instance_of(Doorkeeper::OAuth::TokenResponse)
61
- expect(result.body).to eq(
62
- Doorkeeper::OAuth::TokenResponse.new(access_token).body,
63
- )
64
- end
65
- end
66
-
67
- context "when invalid" do
68
- context "with error other than invalid_request" do
69
- before do
70
- allow(subject).to receive(:valid?).and_return(false)
71
- allow(subject).to receive(:error).and_return(:server_error)
72
- allow(subject).to receive(:state).and_return("hello")
73
- end
74
-
75
- it "returns an ErrorResponse object" do
76
- result = subject.authorize
77
-
78
- expect(result).to be_an_instance_of(Doorkeeper::OAuth::ErrorResponse)
79
-
80
- expect(result.body).to eq(
81
- error: :server_error,
82
- error_description: translated_error_message(:server_error),
83
- state: "hello",
84
- )
85
- end
86
- end
87
-
88
- context "with invalid_request error" do
89
- before do
90
- allow(subject).to receive(:valid?).and_return(false)
91
- allow(subject).to receive(:error).and_return(:invalid_request)
92
- allow(subject).to receive(:state).and_return("hello")
93
- end
94
-
95
- it "returns an InvalidRequestResponse object" do
96
- result = subject.authorize
97
-
98
- expect(result).to be_an_instance_of(Doorkeeper::OAuth::InvalidRequestResponse)
99
-
100
- expect(result.body).to eq(
101
- error: :invalid_request,
102
- error_description: translated_invalid_request_error_message(:unknown, :unknown),
103
- state: "hello",
104
- )
105
- end
106
- end
107
- end
108
- end
109
-
110
- describe "#default_scopes" do
111
- it "delegates to the server" do
112
- expect(subject).to receive(:server).and_return(server).once
113
- expect(server).to receive(:default_scopes).once
114
-
115
- subject.default_scopes
116
- end
117
- end
118
-
119
- describe "#find_or_create_access_token" do
120
- let(:resource_owner) { FactoryBot.build_stubbed(:resource_owner) }
121
-
122
- it "returns an instance of AccessToken" do
123
- result = subject.find_or_create_access_token(
124
- client,
125
- resource_owner,
126
- "public",
127
- server,
128
- )
129
-
130
- expect(result).to be_an_instance_of(Doorkeeper::AccessToken)
131
- end
132
-
133
- it "respects custom_access_token_expires_in" do
134
- server = double(
135
- :server,
136
- access_token_expires_in: 100,
137
- custom_access_token_expires_in: ->(context) { context.scopes == "public" ? 500 : nil },
138
- refresh_token_enabled?: false,
139
- )
140
-
141
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
142
-
143
- result = subject.find_or_create_access_token(
144
- client,
145
- resource_owner,
146
- "public",
147
- server,
148
- )
149
- expect(result.expires_in).to be(500)
150
- end
151
-
152
- it "respects use_refresh_token with a block" do
153
- server = double(
154
- :server,
155
- access_token_expires_in: 100,
156
- custom_access_token_expires_in: ->(_context) { nil },
157
- refresh_token_enabled?: lambda { |context|
158
- context.scopes == "public"
159
- },
160
- )
161
-
162
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
163
-
164
- result = subject.find_or_create_access_token(
165
- client,
166
- resource_owner,
167
- "public",
168
- server,
169
- )
170
- expect(result.refresh_token).not_to be_nil
171
-
172
- result = subject.find_or_create_access_token(
173
- client,
174
- resource_owner,
175
- "private",
176
- server,
177
- )
178
- expect(result.refresh_token).to be_nil
179
- end
180
- end
181
-
182
- describe "#scopes" do
183
- context "when @original_scopes is present" do
184
- before do
185
- subject.instance_variable_set(:@original_scopes, "public write")
186
- end
187
-
188
- it "returns array of @original_scopes" do
189
- result = subject.scopes
190
-
191
- expect(result).to eq(scopes_array)
192
- end
193
- end
194
-
195
- context "when @original_scopes is blank" do
196
- before do
197
- subject.instance_variable_set(:@original_scopes, "")
198
- end
199
-
200
- it "calls #default_scopes" do
201
- allow(subject).to receive(:server).and_return(server).once
202
- allow(server).to receive(:default_scopes).and_return(scopes_array).once
203
-
204
- result = subject.scopes
205
-
206
- expect(result).to eq(scopes_array)
207
- end
208
- end
209
- end
210
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::OAuth::BaseResponse do
6
- subject do
7
- described_class.new
8
- end
9
-
10
- describe "#body" do
11
- it "returns an empty Hash" do
12
- expect(subject.body).to eq({})
13
- end
14
- end
15
-
16
- describe "#description" do
17
- it "returns an empty String" do
18
- expect(subject.description).to eq("")
19
- end
20
- end
21
-
22
- describe "#headers" do
23
- it "returns an empty Hash" do
24
- expect(subject.headers).to eq({})
25
- end
26
- end
27
-
28
- describe "#redirectable?" do
29
- it "returns false" do
30
- expect(subject.redirectable?).to eq(false)
31
- end
32
- end
33
-
34
- describe "#redirect_uri" do
35
- it "returns an empty String" do
36
- expect(subject.redirect_uri).to eq("")
37
- end
38
- end
39
-
40
- describe "#status" do
41
- it "returns :ok" do
42
- expect(subject.status).to eq(:ok)
43
- end
44
- end
45
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- class Doorkeeper::OAuth::Client
6
- describe Credentials do
7
- let(:client_id) { "some-uid" }
8
- let(:client_secret) { "some-secret" }
9
-
10
- it "is blank when the uid in credentials is blank" do
11
- expect(described_class.new(nil, nil)).to be_blank
12
- expect(described_class.new(nil, "something")).to be_blank
13
- expect(described_class.new("something", nil)).to be_present
14
- expect(described_class.new("something", "something")).to be_present
15
- end
16
-
17
- describe ".from_request" do
18
- let(:request) { double.as_null_object }
19
-
20
- let(:method) do
21
- ->(_request) { %w[uid secret] }
22
- end
23
-
24
- it "accepts anything that responds to #call" do
25
- expect(method).to receive(:call).with(request)
26
- described_class.from_request request, method
27
- end
28
-
29
- it "delegates methods received as symbols to Credentials class" do
30
- expect(described_class).to receive(:from_params).with(request)
31
- described_class.from_request request, :from_params
32
- end
33
-
34
- it "stops at the first credentials found" do
35
- not_called_method = double
36
- expect(not_called_method).not_to receive(:call)
37
- described_class.from_request request, ->(_) {}, method, not_called_method
38
- end
39
-
40
- it "returns new Credentials" do
41
- credentials = described_class.from_request request, method
42
- expect(credentials).to be_a(described_class)
43
- end
44
-
45
- it "returns uid and secret from extractor method" do
46
- credentials = described_class.from_request request, method
47
- expect(credentials.uid).to eq("uid")
48
- expect(credentials.secret).to eq("secret")
49
- end
50
- end
51
-
52
- describe ".from_params" do
53
- it "returns credentials from parameters when Authorization header is not available" do
54
- request = double parameters: { client_id: client_id, client_secret: client_secret }
55
- uid, secret = described_class.from_params(request)
56
-
57
- expect(uid).to eq("some-uid")
58
- expect(secret).to eq("some-secret")
59
- end
60
-
61
- it "is blank when there are no credentials" do
62
- request = double parameters: {}
63
- uid, secret = described_class.from_params(request)
64
-
65
- expect(uid).to be_blank
66
- expect(secret).to be_blank
67
- end
68
- end
69
-
70
- describe ".from_basic" do
71
- let(:credentials) { Base64.encode64("#{client_id}:#{client_secret}") }
72
-
73
- it "decodes the credentials" do
74
- request = double authorization: "Basic #{credentials}"
75
- uid, secret = described_class.from_basic(request)
76
-
77
- expect(uid).to eq("some-uid")
78
- expect(secret).to eq("some-secret")
79
- end
80
-
81
- it "is blank if Authorization is not Basic" do
82
- request = double authorization: credentials.to_s
83
- uid, secret = described_class.from_basic(request)
84
-
85
- expect(uid).to be_blank
86
- expect(secret).to be_blank
87
- end
88
- end
89
- end
90
- end
@@ -1,135 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::OAuth::ClientCredentials::Creator do
6
- let(:client) { FactoryBot.create :application }
7
- let(:scopes) { Doorkeeper::OAuth::Scopes.from_string("public") }
8
-
9
- before do
10
- default_scopes_exist :public
11
- end
12
-
13
- it "creates a new token" do
14
- expect do
15
- subject.call(client, scopes)
16
- end.to change { Doorkeeper::AccessToken.count }.by(1)
17
- end
18
-
19
- context "when reuse_access_token is true" do
20
- before do
21
- allow(Doorkeeper.config).to receive(:reuse_access_token).and_return(true)
22
- end
23
-
24
- context "when expiration is disabled" do
25
- it "returns the existing valid token" do
26
- existing_token = subject.call(client, scopes)
27
-
28
- result = subject.call(client, scopes)
29
-
30
- expect(Doorkeeper::AccessToken.count).to eq(1)
31
- expect(result).to eq(existing_token)
32
- end
33
- end
34
-
35
- context "when existing token has not crossed token_reuse_limit" do
36
- let!(:existing_token) { subject.call(client, scopes, expires_in: 1000) }
37
-
38
- before do
39
- allow(Doorkeeper.config).to receive(:token_reuse_limit).and_return(50)
40
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:expires_in_seconds).and_return(600)
41
- end
42
-
43
- it "returns the existing valid token" do
44
- result = subject.call(client, scopes, expires_in: 1000)
45
-
46
- expect(Doorkeeper::AccessToken.count).to eq(1)
47
- expect(result).to eq(existing_token)
48
- end
49
-
50
- context "when revoke_previous_client_credentials_token is false" do
51
- before do
52
- allow(Doorkeeper.config).to receive(:revoke_previous_client_credentials_token).and_return(false)
53
- end
54
-
55
- it "does not revoke the existing valid token" do
56
- subject.call(client, scopes, expires_in: 1000)
57
- expect(existing_token.reload).not_to be_revoked
58
- end
59
- end
60
- end
61
-
62
- context "when existing token has crossed token_reuse_limit" do
63
- it "returns a new token" do
64
- allow(Doorkeeper.config).to receive(:token_reuse_limit).and_return(50)
65
- existing_token = subject.call(client, scopes, expires_in: 1000)
66
-
67
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:expires_in_seconds).and_return(400)
68
- result = subject.call(client, scopes, expires_in: 1000)
69
-
70
- expect(Doorkeeper::AccessToken.count).to eq(2)
71
- expect(result).not_to eq(existing_token)
72
- end
73
- end
74
-
75
- context "when existing token has been expired" do
76
- it "returns a new token" do
77
- allow(Doorkeeper.configuration).to receive(:token_reuse_limit).and_return(50)
78
- existing_token = subject.call(client, scopes, expires_in: 1000)
79
-
80
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:expired?).and_return(true)
81
- result = subject.call(client, scopes, expires_in: 1000)
82
-
83
- expect(Doorkeeper::AccessToken.count).to eq(2)
84
- expect(result).not_to eq(existing_token)
85
- end
86
- end
87
- end
88
-
89
- context "when reuse_access_token is false" do
90
- before do
91
- allow(Doorkeeper.config).to receive(:reuse_access_token).and_return(false)
92
- end
93
-
94
- it "returns a new token" do
95
- existing_token = subject.call(client, scopes)
96
-
97
- result = subject.call(client, scopes)
98
-
99
- expect(Doorkeeper::AccessToken.count).to eq(2)
100
- expect(result).not_to eq(existing_token)
101
- end
102
- end
103
-
104
- context "when revoke_previous_client_credentials_token is true" do
105
- let!(:existing_token) { subject.call(client, scopes, expires_in: 1000) }
106
-
107
- before do
108
- allow(Doorkeeper.configuration).to receive(:revoke_previous_client_credentials_token?).and_return(true)
109
- end
110
-
111
- it "revokes the existing token" do
112
- subject.call(client, scopes, expires_in: 1000)
113
- expect(existing_token.reload).to be_revoked
114
- end
115
- end
116
-
117
- context "when revoke_previous_client_credentials_token is false" do
118
- let!(:existing_token) { subject.call(client, scopes, expires_in: 1000) }
119
-
120
- before do
121
- allow(Doorkeeper.configuration).to receive(:revoke_previous_client_credentials_token?).and_return(false)
122
- end
123
-
124
- it "does not revoke the existing token" do
125
- subject.call(client, scopes, expires_in: 1000)
126
- expect(existing_token.reload).not_to be_revoked
127
- end
128
- end
129
-
130
- it "returns false if creation fails" do
131
- expect(Doorkeeper::AccessToken).to receive(:find_or_create_for).and_return(false)
132
- created = subject.call(client, scopes)
133
- expect(created).to be_falsey
134
- end
135
- end
@@ -1,110 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::OAuth::ClientCredentials::Issuer do
6
- subject { described_class.new(server, validator) }
7
-
8
- let(:creator) { double :access_token_creator }
9
- let(:server) do
10
- double(
11
- :server,
12
- access_token_expires_in: 100,
13
- )
14
- end
15
- let(:validator) { double :validator, valid?: true }
16
-
17
- before do
18
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(false)
19
- end
20
-
21
- describe "#create" do
22
- let(:client) { double :client, id: "some-id" }
23
- let(:scopes) { "some scope" }
24
-
25
- it "creates and sets the token" do
26
- expect(creator).to receive(:call).and_return("token")
27
- subject.create client, scopes, creator
28
-
29
- expect(subject.token).to eq("token")
30
- end
31
-
32
- it "creates with correct token parameters" do
33
- expect(creator).to receive(:call).with(
34
- client,
35
- scopes,
36
- expires_in: 100,
37
- use_refresh_token: false,
38
- )
39
-
40
- subject.create client, scopes, creator
41
- end
42
-
43
- it "has error set to :server_error if creator fails" do
44
- expect(creator).to receive(:call).and_return(false)
45
- subject.create client, scopes, creator
46
-
47
- expect(subject.error).to eq(:server_error)
48
- end
49
-
50
- context "when validator fails" do
51
- before do
52
- allow(validator).to receive(:valid?).and_return(false)
53
- allow(validator).to receive(:error).and_return(:validation_error)
54
- end
55
-
56
- it "has error set from validator" do
57
- expect(creator).not_to receive(:create)
58
- subject.create client, scopes, creator
59
- expect(subject.error).to eq(:validation_error)
60
- end
61
-
62
- it "returns false" do
63
- expect(subject.create(client, scopes, creator)).to be_falsey
64
- end
65
- end
66
-
67
- context "with custom expiration" do
68
- let(:custom_ttl_grant) { 1234 }
69
- let(:custom_ttl_scope) { 1235 }
70
- let(:custom_scope) { "special" }
71
- let(:server) do
72
- double(
73
- :server,
74
- custom_access_token_expires_in: lambda { |context|
75
- # scopes is normally an object but is a string in this test
76
- if context.scopes == custom_scope
77
- custom_ttl_scope
78
- elsif context.grant_type == Doorkeeper::OAuth::CLIENT_CREDENTIALS
79
- custom_ttl_grant
80
- end
81
- },
82
- )
83
- end
84
-
85
- before do
86
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
87
- end
88
-
89
- it "respects grant based rules" do
90
- expect(creator).to receive(:call).with(
91
- client,
92
- scopes,
93
- expires_in: custom_ttl_grant,
94
- use_refresh_token: false,
95
- )
96
- subject.create client, scopes, creator
97
- end
98
-
99
- it "respects scope based rules" do
100
- expect(creator).to receive(:call).with(
101
- client,
102
- custom_scope,
103
- expires_in: custom_ttl_scope,
104
- use_refresh_token: false,
105
- )
106
- subject.create client, custom_scope, creator
107
- end
108
- end
109
- end
110
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Doorkeeper::OAuth::ClientCredentials::Validator do
6
- subject { described_class.new(server, request) }
7
-
8
- let(:server) { double :server, scopes: nil }
9
- let(:application) { double scopes: nil }
10
- let(:client) { double application: application }
11
- let(:request) { double :request, client: client, scopes: nil }
12
-
13
- it "is valid with valid request" do
14
- expect(subject).to be_valid
15
- end
16
-
17
- it "is invalid when client is not present" do
18
- allow(request).to receive(:client).and_return(nil)
19
- expect(subject).not_to be_valid
20
- end
21
-
22
- context "when a grant flow check is configured" do
23
- let(:callback) { double("callback") }
24
-
25
- before do
26
- allow(Doorkeeper.config).to receive(:option_defined?).with(:allow_grant_flow_for_client).and_return(true)
27
- allow(Doorkeeper.config).to receive(:allow_grant_flow_for_client).and_return(callback)
28
- end
29
-
30
- context "when the callback rejects the grant flow" do
31
- let(:callback_response) { false }
32
-
33
- it "is invalid" do
34
- expect(callback).to receive(:call).twice.with(
35
- Doorkeeper::OAuth::CLIENT_CREDENTIALS,
36
- application,
37
- ).and_return(callback_response)
38
-
39
- expect(subject).not_to be_valid
40
- end
41
- end
42
-
43
- context "when the callback allows the grant flow" do
44
- let(:callback_response) { true }
45
-
46
- it "is invalid" do
47
- expect(callback).to receive(:call).twice.with(
48
- Doorkeeper::OAuth::CLIENT_CREDENTIALS,
49
- application,
50
- ).and_return(callback_response)
51
-
52
- expect(subject).to be_valid
53
- end
54
- end
55
- end
56
-
57
- context "with scopes" do
58
- it "is invalid when scopes are not included in the server" do
59
- server_scopes = Doorkeeper::OAuth::Scopes.from_string "email"
60
- allow(request).to receive(:grant_type).and_return(Doorkeeper::OAuth::CLIENT_CREDENTIALS)
61
- allow(server).to receive(:scopes).and_return(server_scopes)
62
- allow(request).to receive(:scopes).and_return(
63
- Doorkeeper::OAuth::Scopes.from_string("invalid"),
64
- )
65
- expect(subject).not_to be_valid
66
- end
67
-
68
- context "with application scopes" do
69
- it "is valid when scopes are included in the application" do
70
- application_scopes = Doorkeeper::OAuth::Scopes.from_string "app"
71
- server_scopes = Doorkeeper::OAuth::Scopes.from_string "email app"
72
- allow(application).to receive(:scopes).and_return(application_scopes)
73
- allow(server).to receive(:scopes).and_return(server_scopes)
74
- allow(request).to receive(:grant_type).and_return(Doorkeeper::OAuth::CLIENT_CREDENTIALS)
75
- allow(request).to receive(:scopes).and_return(application_scopes)
76
- expect(subject).to be_valid
77
- end
78
-
79
- it "is invalid when scopes are not included in the application" do
80
- application_scopes = Doorkeeper::OAuth::Scopes.from_string "app"
81
- server_scopes = Doorkeeper::OAuth::Scopes.from_string "email app"
82
- allow(application).to receive(:scopes).and_return(application_scopes)
83
- allow(request).to receive(:grant_type).and_return(Doorkeeper::OAuth::CLIENT_CREDENTIALS)
84
- allow(server).to receive(:scopes).and_return(server_scopes)
85
- allow(request).to receive(:scopes).and_return(
86
- Doorkeeper::OAuth::Scopes.from_string("email"),
87
- )
88
- expect(subject).not_to be_valid
89
- end
90
- end
91
- end
92
- end