doorkeeper 5.2.2 → 5.5.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of doorkeeper might be problematic. Click here for more details.

Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +198 -3
  3. data/README.md +28 -20
  4. data/app/controllers/doorkeeper/application_controller.rb +3 -2
  5. data/app/controllers/doorkeeper/application_metal_controller.rb +2 -2
  6. data/app/controllers/doorkeeper/applications_controller.rb +7 -8
  7. data/app/controllers/doorkeeper/authorizations_controller.rb +48 -18
  8. data/app/controllers/doorkeeper/authorized_applications_controller.rb +6 -6
  9. data/app/controllers/doorkeeper/token_info_controller.rb +12 -2
  10. data/app/controllers/doorkeeper/tokens_controller.rb +70 -25
  11. data/app/helpers/doorkeeper/dashboard_helper.rb +1 -1
  12. data/app/views/doorkeeper/applications/_form.html.erb +1 -1
  13. data/app/views/doorkeeper/applications/show.html.erb +35 -14
  14. data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
  15. data/app/views/doorkeeper/authorizations/new.html.erb +2 -0
  16. data/config/locales/en.yml +9 -2
  17. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  18. data/lib/doorkeeper/config/option.rb +26 -14
  19. data/lib/doorkeeper/config/validations.rb +53 -0
  20. data/lib/doorkeeper/config.rb +214 -122
  21. data/lib/doorkeeper/engine.rb +1 -1
  22. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  23. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  24. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  25. data/lib/doorkeeper/grant_flow.rb +45 -0
  26. data/lib/doorkeeper/grape/helpers.rb +2 -2
  27. data/lib/doorkeeper/helpers/controller.rb +18 -12
  28. data/lib/doorkeeper/models/access_grant_mixin.rb +23 -19
  29. data/lib/doorkeeper/models/access_token_mixin.rb +157 -55
  30. data/lib/doorkeeper/models/application_mixin.rb +8 -7
  31. data/lib/doorkeeper/models/concerns/expirable.rb +1 -1
  32. data/lib/doorkeeper/models/concerns/ownership.rb +1 -1
  33. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  34. data/lib/doorkeeper/models/concerns/reusable.rb +1 -1
  35. data/lib/doorkeeper/models/concerns/revocable.rb +1 -28
  36. data/lib/doorkeeper/models/concerns/scopes.rb +5 -1
  37. data/lib/doorkeeper/models/concerns/secret_storable.rb +1 -3
  38. data/lib/doorkeeper/oauth/authorization/code.rb +22 -9
  39. data/lib/doorkeeper/oauth/authorization/context.rb +5 -5
  40. data/lib/doorkeeper/oauth/authorization/token.rb +23 -18
  41. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +4 -4
  42. data/lib/doorkeeper/oauth/authorization_code_request.rb +30 -20
  43. data/lib/doorkeeper/oauth/base_request.rb +19 -23
  44. data/lib/doorkeeper/oauth/client/credentials.rb +2 -4
  45. data/lib/doorkeeper/oauth/client.rb +8 -9
  46. data/lib/doorkeeper/oauth/client_credentials/creator.rb +38 -12
  47. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +10 -8
  48. data/lib/doorkeeper/oauth/client_credentials/{validation.rb → validator.rb} +7 -5
  49. data/lib/doorkeeper/oauth/client_credentials_request.rb +8 -7
  50. data/lib/doorkeeper/oauth/code_request.rb +4 -4
  51. data/lib/doorkeeper/oauth/code_response.rb +24 -14
  52. data/lib/doorkeeper/oauth/error.rb +1 -1
  53. data/lib/doorkeeper/oauth/error_response.rb +10 -11
  54. data/lib/doorkeeper/oauth/forbidden_token_response.rb +2 -1
  55. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +8 -12
  56. data/lib/doorkeeper/oauth/helpers/unique_token.rb +10 -7
  57. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +1 -19
  58. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  59. data/lib/doorkeeper/oauth/invalid_request_response.rb +3 -3
  60. data/lib/doorkeeper/oauth/invalid_token_response.rb +7 -4
  61. data/lib/doorkeeper/oauth/password_access_token_request.rb +28 -10
  62. data/lib/doorkeeper/oauth/pre_authorization.rb +73 -37
  63. data/lib/doorkeeper/oauth/refresh_token_request.rb +35 -26
  64. data/lib/doorkeeper/oauth/token.rb +6 -7
  65. data/lib/doorkeeper/oauth/token_introspection.rb +12 -16
  66. data/lib/doorkeeper/oauth/token_request.rb +3 -3
  67. data/lib/doorkeeper/oauth/token_response.rb +1 -1
  68. data/lib/doorkeeper/orm/active_record/access_grant.rb +4 -43
  69. data/lib/doorkeeper/orm/active_record/access_token.rb +4 -35
  70. data/lib/doorkeeper/orm/active_record/application.rb +5 -95
  71. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +69 -0
  72. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +60 -0
  73. data/lib/doorkeeper/orm/active_record/mixins/application.rb +199 -0
  74. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +8 -3
  75. data/lib/doorkeeper/orm/active_record.rb +5 -7
  76. data/lib/doorkeeper/rails/helpers.rb +4 -4
  77. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  78. data/lib/doorkeeper/rails/routes/mapper.rb +2 -2
  79. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  80. data/lib/doorkeeper/rails/routes.rb +17 -25
  81. data/lib/doorkeeper/rake/db.rake +6 -6
  82. data/lib/doorkeeper/rake/setup.rake +5 -0
  83. data/lib/doorkeeper/request/authorization_code.rb +3 -3
  84. data/lib/doorkeeper/request/client_credentials.rb +2 -2
  85. data/lib/doorkeeper/request/password.rb +3 -2
  86. data/lib/doorkeeper/request/refresh_token.rb +5 -4
  87. data/lib/doorkeeper/request/strategy.rb +2 -2
  88. data/lib/doorkeeper/request.rb +49 -12
  89. data/lib/doorkeeper/server.rb +5 -5
  90. data/lib/doorkeeper/stale_records_cleaner.rb +4 -4
  91. data/lib/doorkeeper/version.rb +2 -6
  92. data/lib/doorkeeper.rb +112 -81
  93. data/lib/generators/doorkeeper/application_owner_generator.rb +1 -1
  94. data/lib/generators/doorkeeper/confidential_applications_generator.rb +2 -2
  95. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  96. data/lib/generators/doorkeeper/migration_generator.rb +1 -1
  97. data/lib/generators/doorkeeper/pkce_generator.rb +1 -1
  98. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +2 -2
  99. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +3 -1
  100. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
  101. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +2 -0
  102. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  103. data/lib/generators/doorkeeper/templates/initializer.rb +99 -14
  104. data/lib/generators/doorkeeper/templates/migration.rb.erb +14 -5
  105. metadata +37 -306
  106. data/Appraisals +0 -40
  107. data/CODE_OF_CONDUCT.md +0 -46
  108. data/CONTRIBUTING.md +0 -49
  109. data/Dangerfile +0 -67
  110. data/Dockerfile +0 -29
  111. data/Gemfile +0 -25
  112. data/NEWS.md +0 -1
  113. data/RELEASING.md +0 -11
  114. data/Rakefile +0 -28
  115. data/SECURITY.md +0 -15
  116. data/UPGRADE.md +0 -2
  117. data/bin/console +0 -16
  118. data/doorkeeper.gemspec +0 -42
  119. data/gemfiles/rails_5_0.gemfile +0 -18
  120. data/gemfiles/rails_5_1.gemfile +0 -18
  121. data/gemfiles/rails_5_2.gemfile +0 -18
  122. data/gemfiles/rails_6_0.gemfile +0 -18
  123. data/gemfiles/rails_master.gemfile +0 -18
  124. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  125. data/spec/controllers/applications_controller_spec.rb +0 -273
  126. data/spec/controllers/authorizations_controller_spec.rb +0 -608
  127. data/spec/controllers/protected_resources_controller_spec.rb +0 -353
  128. data/spec/controllers/token_info_controller_spec.rb +0 -50
  129. data/spec/controllers/tokens_controller_spec.rb +0 -498
  130. data/spec/dummy/Rakefile +0 -9
  131. data/spec/dummy/app/assets/config/manifest.js +0 -2
  132. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  133. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
  134. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
  135. data/spec/dummy/app/controllers/home_controller.rb +0 -18
  136. data/spec/dummy/app/controllers/metal_controller.rb +0 -13
  137. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
  138. data/spec/dummy/app/helpers/application_helper.rb +0 -7
  139. data/spec/dummy/app/models/user.rb +0 -7
  140. data/spec/dummy/app/views/home/index.html.erb +0 -0
  141. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  142. data/spec/dummy/config/application.rb +0 -49
  143. data/spec/dummy/config/boot.rb +0 -7
  144. data/spec/dummy/config/database.yml +0 -15
  145. data/spec/dummy/config/environment.rb +0 -5
  146. data/spec/dummy/config/environments/development.rb +0 -31
  147. data/spec/dummy/config/environments/production.rb +0 -64
  148. data/spec/dummy/config/environments/test.rb +0 -45
  149. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
  150. data/spec/dummy/config/initializers/doorkeeper.rb +0 -166
  151. data/spec/dummy/config/initializers/secret_token.rb +0 -10
  152. data/spec/dummy/config/initializers/session_store.rb +0 -10
  153. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  154. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  155. data/spec/dummy/config/routes.rb +0 -13
  156. data/spec/dummy/config.ru +0 -6
  157. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  158. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  159. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -69
  160. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  161. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  162. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -8
  163. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -13
  164. data/spec/dummy/db/schema.rb +0 -68
  165. data/spec/dummy/public/404.html +0 -26
  166. data/spec/dummy/public/422.html +0 -26
  167. data/spec/dummy/public/500.html +0 -26
  168. data/spec/dummy/public/favicon.ico +0 -0
  169. data/spec/dummy/script/rails +0 -9
  170. data/spec/factories.rb +0 -30
  171. data/spec/generators/application_owner_generator_spec.rb +0 -28
  172. data/spec/generators/confidential_applications_generator_spec.rb +0 -29
  173. data/spec/generators/install_generator_spec.rb +0 -36
  174. data/spec/generators/migration_generator_spec.rb +0 -28
  175. data/spec/generators/pkce_generator_spec.rb +0 -28
  176. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
  177. data/spec/generators/templates/routes.rb +0 -4
  178. data/spec/generators/views_generator_spec.rb +0 -29
  179. data/spec/grape/grape_integration_spec.rb +0 -137
  180. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  181. data/spec/lib/config_spec.rb +0 -739
  182. data/spec/lib/doorkeeper_spec.rb +0 -27
  183. data/spec/lib/models/expirable_spec.rb +0 -61
  184. data/spec/lib/models/reusable_spec.rb +0 -40
  185. data/spec/lib/models/revocable_spec.rb +0 -59
  186. data/spec/lib/models/scopes_spec.rb +0 -53
  187. data/spec/lib/models/secret_storable_spec.rb +0 -135
  188. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
  189. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -168
  190. data/spec/lib/oauth/base_request_spec.rb +0 -222
  191. data/spec/lib/oauth/base_response_spec.rb +0 -47
  192. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  193. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -97
  194. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -112
  195. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -59
  196. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -29
  197. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -109
  198. data/spec/lib/oauth/client_spec.rb +0 -38
  199. data/spec/lib/oauth/code_request_spec.rb +0 -46
  200. data/spec/lib/oauth/code_response_spec.rb +0 -36
  201. data/spec/lib/oauth/error_response_spec.rb +0 -66
  202. data/spec/lib/oauth/error_spec.rb +0 -23
  203. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -22
  204. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -98
  205. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  206. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -262
  207. data/spec/lib/oauth/invalid_request_response_spec.rb +0 -75
  208. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -55
  209. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -192
  210. data/spec/lib/oauth/pre_authorization_spec.rb +0 -225
  211. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -178
  212. data/spec/lib/oauth/scopes_spec.rb +0 -148
  213. data/spec/lib/oauth/token_request_spec.rb +0 -153
  214. data/spec/lib/oauth/token_response_spec.rb +0 -86
  215. data/spec/lib/oauth/token_spec.rb +0 -158
  216. data/spec/lib/request/strategy_spec.rb +0 -54
  217. data/spec/lib/secret_storing/base_spec.rb +0 -60
  218. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
  219. data/spec/lib/secret_storing/plain_spec.rb +0 -44
  220. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
  221. data/spec/lib/server_spec.rb +0 -49
  222. data/spec/lib/stale_records_cleaner_spec.rb +0 -89
  223. data/spec/models/doorkeeper/access_grant_spec.rb +0 -163
  224. data/spec/models/doorkeeper/access_token_spec.rb +0 -622
  225. data/spec/models/doorkeeper/application_spec.rb +0 -377
  226. data/spec/requests/applications/applications_request_spec.rb +0 -259
  227. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  228. data/spec/requests/endpoints/authorization_spec.rb +0 -89
  229. data/spec/requests/endpoints/token_spec.rb +0 -75
  230. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -79
  231. data/spec/requests/flows/authorization_code_spec.rb +0 -513
  232. data/spec/requests/flows/client_credentials_spec.rb +0 -166
  233. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -46
  234. data/spec/requests/flows/implicit_grant_spec.rb +0 -91
  235. data/spec/requests/flows/password_spec.rb +0 -296
  236. data/spec/requests/flows/refresh_token_spec.rb +0 -233
  237. data/spec/requests/flows/revoke_token_spec.rb +0 -151
  238. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  239. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  240. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  241. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  242. data/spec/routing/default_routes_spec.rb +0 -41
  243. data/spec/routing/scoped_routes_spec.rb +0 -47
  244. data/spec/spec_helper.rb +0 -57
  245. data/spec/spec_helper_integration.rb +0 -4
  246. data/spec/support/dependencies/factory_bot.rb +0 -4
  247. data/spec/support/doorkeeper_rspec.rb +0 -22
  248. data/spec/support/helpers/access_token_request_helper.rb +0 -13
  249. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  250. data/spec/support/helpers/config_helper.rb +0 -11
  251. data/spec/support/helpers/model_helper.rb +0 -78
  252. data/spec/support/helpers/request_spec_helper.rb +0 -110
  253. data/spec/support/helpers/url_helper.rb +0 -62
  254. data/spec/support/http_method_shim.rb +0 -29
  255. data/spec/support/orm/active_record.rb +0 -5
  256. data/spec/support/shared/controllers_shared_context.rb +0 -123
  257. data/spec/support/shared/hashing_shared_context.rb +0 -36
  258. data/spec/support/shared/models_shared_examples.rb +0 -54
  259. data/spec/validators/redirect_uri_validator_spec.rb +0 -183
  260. data/spec/version/version_spec.rb +0 -17
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper do
6
- describe "#authenticate" do
7
- let(:request) { double }
8
-
9
- it "calls OAuth::Token#authenticate" do
10
- token_strategies = Doorkeeper.configuration.access_token_methods
11
-
12
- expect(Doorkeeper::OAuth::Token).to receive(:authenticate)
13
- .with(request, *token_strategies)
14
-
15
- Doorkeeper.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
- Doorkeeper.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
- describe "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 "should return 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 "should return 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 "should return 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 "should return 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 "should return 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
- describe "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,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe "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_attribute).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 existing, and resets the
40
- `previous_refresh_token` attribute" do
41
- previous_token = FactoryBot.create(
42
- :access_token,
43
- refresh_token: "refresh_token"
44
- )
45
- current_token = FactoryBot.create(
46
- :access_token,
47
- previous_refresh_token: previous_token.refresh_token
48
- )
49
-
50
- expect_any_instance_of(
51
- Doorkeeper::AccessToken
52
- ).to receive(:revoke).and_call_original
53
- current_token.revoke_previous_refresh_token!
54
-
55
- expect(current_token.previous_refresh_token).to be_empty
56
- expect(previous_token.reload).to be_revoked
57
- end
58
- end
59
- end
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- 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
- end
37
-
38
- describe :scopes_string do
39
- it "is a `Scopes` class" do
40
- expect(subject.scopes_string).to eq("public admin")
41
- end
42
- end
43
-
44
- describe :includes_scope? do
45
- it "should return true if at least one scope is included" do
46
- expect(subject.includes_scope?("public", "private")).to be true
47
- end
48
-
49
- it "should return false if no scopes are included" do
50
- expect(subject.includes_scope?("teacher", "student")).to be false
51
- end
52
- end
53
- end
@@ -1,135 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe "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
- let(:fallback) { double(::Doorkeeper::SecretStoring::Plain) }
60
-
61
- it "returns nil if none defined" do
62
- expect(clazz.fallback_secret_strategy).to eq nil
63
- expect(subject).to eq nil
64
- end
65
-
66
- context "if a fallback strategy is defined" do
67
- before do
68
- allow(clazz).to receive(:fallback_secret_strategy).and_return(fallback)
69
- end
70
-
71
- context "if a resource is defined" do
72
- let(:resource) { double("Token model") }
73
-
74
- it "calls the strategy for lookup" do
75
- expect(clazz)
76
- .to receive(:find_by)
77
- .with("attr" => "fallback")
78
- .and_return(resource)
79
-
80
- expect(fallback)
81
- .to receive(:transform_secret)
82
- .with("input")
83
- .and_return("fallback")
84
-
85
- # store_secret will call the resource
86
- expect(resource)
87
- .to receive(:attr=)
88
- .with("new value")
89
-
90
- # It will upgrade the secret automtically using the current strategy
91
- expect(strategy)
92
- .to receive(:transform_secret)
93
- .with("input")
94
- .and_return("new value")
95
-
96
- expect(resource).to receive(:update).with("attr" => "new value")
97
- expect(subject).to eq resource
98
- end
99
- end
100
-
101
- context "if a resource is not defined" do
102
- before do
103
- allow(clazz).to receive(:fallback_secret_strategy).and_return(fallback)
104
- end
105
-
106
- it "returns nil" do
107
- expect(clazz)
108
- .to receive(:find_by)
109
- .with("attr" => "fallback")
110
- .and_return(nil)
111
-
112
- expect(fallback)
113
- .to receive(:transform_secret)
114
- .with("input")
115
- .and_return("fallback")
116
-
117
- # It does not find a token even with the fallback method
118
- expect(subject).to be_nil
119
- end
120
- end
121
- end
122
- end
123
-
124
- describe :secret_strategy do
125
- it "defaults to plain strategy" do
126
- expect(strategy).to eq Doorkeeper::SecretStoring::Plain
127
- end
128
- end
129
-
130
- describe :fallback_secret_strategy do
131
- it "defaults to nil" do
132
- expect(clazz.fallback_secret_strategy).to eq nil
133
- end
134
- end
135
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth::Authorization
6
- describe URIBuilder do
7
- subject { URIBuilder }
8
-
9
- describe :uri_with_query do
10
- it "returns the uri with query" do
11
- uri = subject.uri_with_query "http://example.com/", parameter: "value"
12
- expect(uri).to eq("http://example.com/?parameter=value")
13
- end
14
-
15
- it "rejects nil values" do
16
- uri = subject.uri_with_query "http://example.com/", parameter: ""
17
- expect(uri).to eq("http://example.com/?")
18
- end
19
-
20
- it "preserves original query parameters" do
21
- uri = subject.uri_with_query "http://example.com/?query1=value", parameter: "value"
22
- expect(uri).to match(/query1=value/)
23
- expect(uri).to match(/parameter=value/)
24
- end
25
- end
26
-
27
- describe :uri_with_fragment do
28
- it "returns uri with parameters as fragments" do
29
- uri = subject.uri_with_fragment "http://example.com/", parameter: "value"
30
- expect(uri).to eq("http://example.com/#parameter=value")
31
- end
32
-
33
- it "preserves original query parameters" do
34
- uri = subject.uri_with_fragment "http://example.com/?query1=value1", parameter: "value"
35
- expect(uri).to eq("http://example.com/?query1=value1#parameter=value")
36
- end
37
- end
38
- end
39
- end
@@ -1,168 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth
6
- describe AuthorizationCodeRequest do
7
- let(:server) do
8
- double :server,
9
- access_token_expires_in: 2.days,
10
- refresh_token_enabled?: false,
11
- custom_access_token_expires_in: lambda { |context|
12
- context.grant_type == Doorkeeper::OAuth::AUTHORIZATION_CODE ? 1234 : nil
13
- }
14
- end
15
-
16
- let(:grant) { FactoryBot.create :access_grant }
17
- let(:client) { grant.application }
18
- let(:redirect_uri) { client.redirect_uri }
19
- let(:params) { { redirect_uri: redirect_uri } }
20
-
21
- before do
22
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
23
- end
24
-
25
- subject do
26
- AuthorizationCodeRequest.new(server, grant, client, params)
27
- end
28
-
29
- it "issues a new token for the client" do
30
- expect do
31
- subject.authorize
32
- end.to change { client.reload.access_tokens.count }.by(1)
33
-
34
- expect(client.reload.access_tokens.max_by(&:created_at).expires_in).to eq(1234)
35
- end
36
-
37
- it "issues the token with same grant's scopes" do
38
- subject.authorize
39
- expect(Doorkeeper::AccessToken.last.scopes).to eq(grant.scopes)
40
- end
41
-
42
- it "revokes the grant" do
43
- expect { subject.authorize }.to(change { grant.reload.accessible? })
44
- end
45
-
46
- it "requires the grant to be accessible" do
47
- grant.revoke
48
- subject.validate
49
- expect(subject.error).to eq(:invalid_grant)
50
- end
51
-
52
- it "requires the grant" do
53
- subject.grant = nil
54
- subject.validate
55
- expect(subject.error).to eq(:invalid_grant)
56
- end
57
-
58
- it "requires the client" do
59
- subject.client = nil
60
- subject.validate
61
- expect(subject.error).to eq(:invalid_client)
62
- end
63
-
64
- it "requires the redirect_uri" do
65
- subject.redirect_uri = nil
66
- subject.validate
67
- expect(subject.error).to eq(:invalid_request)
68
- expect(subject.missing_param).to eq(:redirect_uri)
69
- end
70
-
71
- it "invalid code_verifier param because server does not support pkce" do
72
- # Some other ORMs work relies on #respond_to? so it's not a good idea to stub it :\
73
- allow_any_instance_of(Doorkeeper::AccessGrant).to receive(:respond_to?).with(anything).and_call_original
74
- allow_any_instance_of(Doorkeeper::AccessGrant).to receive(:respond_to?).with(:code_challenge).and_return(false)
75
-
76
- subject.code_verifier = "a45a9fea-0676-477e-95b1-a40f72ac3cfb"
77
- subject.validate
78
- expect(subject.error).to eq(:invalid_request)
79
- expect(subject.invalid_request_reason).to eq(:not_support_pkce)
80
- end
81
-
82
- it "matches the redirect_uri with grant's one" do
83
- subject.redirect_uri = "http://other.com"
84
- subject.validate
85
- expect(subject.error).to eq(:invalid_grant)
86
- end
87
-
88
- it "matches the client with grant's one" do
89
- subject.client = FactoryBot.create :application
90
- subject.validate
91
- expect(subject.error).to eq(:invalid_grant)
92
- end
93
-
94
- it "skips token creation if there is a matching one reusable" do
95
- scopes = grant.scopes
96
-
97
- Doorkeeper.configure do
98
- orm DOORKEEPER_ORM
99
- reuse_access_token
100
- default_scopes(*scopes)
101
- end
102
-
103
- FactoryBot.create(:access_token, application_id: client.id,
104
- resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s)
105
-
106
- expect { subject.authorize }.to_not(change { Doorkeeper::AccessToken.count })
107
- end
108
-
109
- it "creates token if there is a matching one but non reusable" do
110
- scopes = grant.scopes
111
-
112
- Doorkeeper.configure do
113
- orm DOORKEEPER_ORM
114
- reuse_access_token
115
- default_scopes(*scopes)
116
- end
117
-
118
- FactoryBot.create(:access_token, application_id: client.id,
119
- resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s)
120
-
121
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:reusable?).and_return(false)
122
-
123
- expect { subject.authorize }.to change { Doorkeeper::AccessToken.count }.by(1)
124
- end
125
-
126
- it "calls configured request callback methods" do
127
- expect(Doorkeeper.configuration.before_successful_strategy_response)
128
- .to receive(:call).with(subject).once
129
- expect(Doorkeeper.configuration.after_successful_strategy_response)
130
- .to receive(:call).with(subject, instance_of(Doorkeeper::OAuth::TokenResponse)).once
131
-
132
- subject.authorize
133
- end
134
-
135
- context "when redirect_uri contains some query params" do
136
- let(:redirect_uri) { client.redirect_uri + "?query=q" }
137
-
138
- it "compares only host part with grant's redirect_uri" do
139
- subject.validate
140
- expect(subject.error).to eq(nil)
141
- end
142
- end
143
-
144
- context "when redirect_uri is not an URI" do
145
- let(:redirect_uri) { "123d#!s" }
146
-
147
- it "responds with invalid_grant" do
148
- subject.validate
149
- expect(subject.error).to eq(:invalid_grant)
150
- end
151
- end
152
-
153
- context "when redirect_uri is the native one" do
154
- let(:redirect_uri) { "urn:ietf:wg:oauth:2.0:oob" }
155
-
156
- it "invalidates when redirect_uri of the grant is not native" do
157
- subject.validate
158
- expect(subject.error).to eq(:invalid_grant)
159
- end
160
-
161
- it "validates when redirect_uri of the grant is also native" do
162
- allow(grant).to receive(:redirect_uri) { redirect_uri }
163
- subject.validate
164
- expect(subject.error).to eq(nil)
165
- end
166
- end
167
- end
168
- end