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,86 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth
6
- describe TokenResponse do
7
- subject { TokenResponse.new(double.as_null_object) }
8
-
9
- it "includes access token response headers" do
10
- headers = subject.headers
11
- expect(headers.fetch("Cache-Control")).to eq("no-store")
12
- expect(headers.fetch("Pragma")).to eq("no-cache")
13
- end
14
-
15
- it "status is ok" do
16
- expect(subject.status).to eq(:ok)
17
- end
18
-
19
- describe ".body" do
20
- let(:access_token) do
21
- double :access_token,
22
- plaintext_token: "some-token",
23
- expires_in: "3600",
24
- expires_in_seconds: "300",
25
- scopes_string: "two scopes",
26
- plaintext_refresh_token: "some-refresh-token",
27
- token_type: "bearer",
28
- created_at: 0
29
- end
30
-
31
- subject { TokenResponse.new(access_token).body }
32
-
33
- it "includes :access_token" do
34
- expect(subject["access_token"]).to eq("some-token")
35
- end
36
-
37
- it "includes :token_type" do
38
- expect(subject["token_type"]).to eq("bearer")
39
- end
40
-
41
- # expires_in_seconds is returned as `expires_in` in order to match
42
- # the OAuth spec (section 4.2.2)
43
- it "includes :expires_in" do
44
- expect(subject["expires_in"]).to eq("300")
45
- end
46
-
47
- it "includes :scope" do
48
- expect(subject["scope"]).to eq("two scopes")
49
- end
50
-
51
- it "includes :refresh_token" do
52
- expect(subject["refresh_token"]).to eq("some-refresh-token")
53
- end
54
-
55
- it "includes :created_at" do
56
- expect(subject["created_at"]).to eq(0)
57
- end
58
- end
59
-
60
- describe ".body filters out empty values" do
61
- let(:access_token) do
62
- double :access_token,
63
- plaintext_token: "some-token",
64
- expires_in_seconds: "",
65
- scopes_string: "",
66
- plaintext_refresh_token: "",
67
- token_type: "bearer",
68
- created_at: 0
69
- end
70
-
71
- subject { TokenResponse.new(access_token).body }
72
-
73
- it "includes :expires_in" do
74
- expect(subject["expires_in"]).to be_nil
75
- end
76
-
77
- it "includes :scope" do
78
- expect(subject["scope"]).to be_nil
79
- end
80
-
81
- it "includes :refresh_token" do
82
- expect(subject["refresh_token"]).to be_nil
83
- end
84
- end
85
- end
86
- end
@@ -1,158 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper
6
- unless defined?(AccessToken)
7
- class AccessToken
8
- end
9
- end
10
-
11
- module OAuth
12
- describe Token do
13
- describe :from_request do
14
- let(:request) { double.as_null_object }
15
-
16
- let(:method) do
17
- ->(*) { "token-value" }
18
- end
19
-
20
- it "accepts anything that responds to #call" do
21
- expect(method).to receive(:call).with(request)
22
- Token.from_request request, method
23
- end
24
-
25
- it "delegates methods received as symbols to Token class" do
26
- expect(Token).to receive(:from_params).with(request)
27
- Token.from_request request, :from_params
28
- end
29
-
30
- it "stops at the first credentials found" do
31
- not_called_method = double
32
- expect(not_called_method).not_to receive(:call)
33
- Token.from_request request, ->(_r) {}, method, not_called_method
34
- end
35
-
36
- it "returns the credential from extractor method" do
37
- credentials = Token.from_request request, method
38
- expect(credentials).to eq("token-value")
39
- end
40
- end
41
-
42
- describe :from_access_token_param do
43
- it "returns token from access_token parameter" do
44
- request = double parameters: { access_token: "some-token" }
45
- token = Token.from_access_token_param(request)
46
- expect(token).to eq("some-token")
47
- end
48
- end
49
-
50
- describe :from_bearer_param do
51
- it "returns token from bearer_token parameter" do
52
- request = double parameters: { bearer_token: "some-token" }
53
- token = Token.from_bearer_param(request)
54
- expect(token).to eq("some-token")
55
- end
56
- end
57
-
58
- describe :from_bearer_authorization do
59
- it "returns token from capitalized authorization bearer" do
60
- request = double authorization: "Bearer SomeToken"
61
- token = Token.from_bearer_authorization(request)
62
- expect(token).to eq("SomeToken")
63
- end
64
-
65
- it "returns token from lowercased authorization bearer" do
66
- request = double authorization: "bearer SomeToken"
67
- token = Token.from_bearer_authorization(request)
68
- expect(token).to eq("SomeToken")
69
- end
70
-
71
- it "does not return token if authorization is not bearer" do
72
- request = double authorization: "MAC SomeToken"
73
- token = Token.from_bearer_authorization(request)
74
- expect(token).to be_blank
75
- end
76
- end
77
-
78
- describe :from_basic_authorization do
79
- it "returns token from capitalized authorization basic" do
80
- request = double authorization: "Basic #{Base64.encode64 "SomeToken:"}"
81
- token = Token.from_basic_authorization(request)
82
- expect(token).to eq("SomeToken")
83
- end
84
-
85
- it "returns token from lowercased authorization basic" do
86
- request = double authorization: "basic #{Base64.encode64 "SomeToken:"}"
87
- token = Token.from_basic_authorization(request)
88
- expect(token).to eq("SomeToken")
89
- end
90
-
91
- it "does not return token if authorization is not basic" do
92
- request = double authorization: "MAC #{Base64.encode64 "SomeToken:"}"
93
- token = Token.from_basic_authorization(request)
94
- expect(token).to be_blank
95
- end
96
- end
97
-
98
- describe :authenticate do
99
- context "refresh tokens are disabled (default)" do
100
- context "refresh tokens are enabled" do
101
- it "does not revoke previous refresh_token if token was found" do
102
- token = ->(_r) { "token" }
103
- expect(
104
- AccessToken
105
- ).to receive(:by_token).with("token").and_return(token)
106
- expect(token).not_to receive(:revoke_previous_refresh_token!)
107
- Token.authenticate double, token
108
- end
109
- end
110
-
111
- it "calls the finder if token was returned" do
112
- token = ->(_r) { "token" }
113
- expect(AccessToken).to receive(:by_token).with("token")
114
- Token.authenticate double, token
115
- end
116
- end
117
-
118
- context "token hashing is enabled" do
119
- include_context "with token hashing enabled"
120
-
121
- let(:hashed_token) { hashed_or_plain_token_func.call("token") }
122
- let(:token) { ->(_r) { "token" } }
123
-
124
- it "searches with the hashed token" do
125
- expect(
126
- AccessToken
127
- ).to receive(:find_by).with(token: hashed_token).and_return(token)
128
- Token.authenticate double, token
129
- end
130
- end
131
-
132
- context "refresh tokens are enabled" do
133
- before do
134
- Doorkeeper.configure do
135
- orm DOORKEEPER_ORM
136
- use_refresh_token
137
- end
138
- end
139
-
140
- it "revokes previous refresh_token if token was found" do
141
- token = ->(_r) { "token" }
142
- expect(
143
- AccessToken
144
- ).to receive(:by_token).with("token").and_return(token)
145
- expect(token).to receive(:revoke_previous_refresh_token!)
146
- Token.authenticate double, token
147
- end
148
-
149
- it "calls the finder if token was returned" do
150
- token = ->(_r) { "token" }
151
- expect(AccessToken).to receive(:by_token).with("token")
152
- Token.authenticate double, token
153
- end
154
- end
155
- end
156
- end
157
- end
158
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper
6
- module Request
7
- describe Strategy do
8
- let(:server) { double }
9
- subject(:strategy) { Strategy.new(server) }
10
-
11
- describe :initialize do
12
- it "sets the server attribute" do
13
- expect(strategy.server).to eq server
14
- end
15
- end
16
-
17
- describe :request do
18
- it "requires an implementation" do
19
- expect { strategy.request }.to raise_exception NotImplementedError
20
- end
21
- end
22
-
23
- describe "a sample Strategy subclass" do
24
- let(:fake_request) { double }
25
-
26
- let(:strategy_class) do
27
- subclass = Class.new(Strategy) do
28
- class << self
29
- attr_accessor :fake_request
30
- end
31
-
32
- def request
33
- self.class.fake_request
34
- end
35
- end
36
-
37
- subclass.fake_request = fake_request
38
- subclass
39
- end
40
-
41
- subject(:strategy) { strategy_class.new(server) }
42
-
43
- it "provides a request implementation" do
44
- expect(strategy.request).to eq fake_request
45
- end
46
-
47
- it "authorizes the request" do
48
- expect(fake_request).to receive :authorize
49
- strategy.authorize
50
- end
51
- end
52
- end
53
- end
54
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe ::Doorkeeper::SecretStoring::Base do
6
- let(:instance) { double("instance", token: "foo") }
7
- subject { described_class }
8
-
9
- describe "#transform_secret" do
10
- it "raises" do
11
- expect { subject.transform_secret("foo") }.to raise_error(NotImplementedError)
12
- end
13
- end
14
-
15
- describe "#store_secret" do
16
- it "sends to response of #transform_secret to the instance" do
17
- expect(described_class)
18
- .to receive(:transform_secret).with("bar")
19
- .and_return "bar+transform"
20
-
21
- expect(instance).to receive(:token=).with "bar+transform"
22
- result = subject.store_secret instance, :token, "bar"
23
- expect(result).to eq "bar+transform"
24
- end
25
- end
26
-
27
- describe "#restore_secret" do
28
- it "raises" do
29
- expect { subject.restore_secret(subject, :token) }.to raise_error(NotImplementedError)
30
- end
31
- end
32
-
33
- describe "#allows_restoring_secrets?" do
34
- it "does not allow it" do
35
- expect(subject.allows_restoring_secrets?).to eq false
36
- end
37
- end
38
-
39
- describe "validate_for" do
40
- it "allows for valid model" do
41
- expect(subject.validate_for(:application)).to eq true
42
- expect(subject.validate_for(:token)).to eq true
43
- end
44
-
45
- it "raises for invalid model" do
46
- expect { subject.validate_for(:wat) }.to raise_error(ArgumentError, /can not be used for wat/)
47
- end
48
- end
49
-
50
- describe "secret_matches?" do
51
- before do
52
- allow(subject).to receive(:transform_secret) { |input| "transformed: #{input}" }
53
- end
54
-
55
- it "compares input with #transform_secret" do
56
- expect(subject.secret_matches?("input", "input")).to eq false
57
- expect(subject.secret_matches?("a", "transformed: a")).to eq true
58
- end
59
- end
60
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
- require "bcrypt"
5
-
6
- describe ::Doorkeeper::SecretStoring::BCrypt do
7
- subject { described_class }
8
- let(:instance) { double("instance", token: "foo") }
9
-
10
- describe "#transform_secret" do
11
- it "creates a bcrypt password" do
12
- expect(subject.transform_secret("foo")).to be_a BCrypt::Password
13
- end
14
- end
15
-
16
- describe "#restore_secret" do
17
- it "raises" do
18
- expect { subject.restore_secret(instance, :token) }.to raise_error(NotImplementedError)
19
- end
20
- end
21
-
22
- describe "#allows_restoring_secrets?" do
23
- it "does not allow it" do
24
- expect(subject.allows_restoring_secrets?).to eq false
25
- end
26
- end
27
-
28
- describe "validate_for" do
29
- it "allows for valid model" do
30
- expect(subject.validate_for(:application)).to eq true
31
- end
32
-
33
- it "raises for invalid model" do
34
- expect { subject.validate_for(:wat) }
35
- .to raise_error(ArgumentError, /can only be used for storing application secrets/)
36
- expect { subject.validate_for(:token) }
37
- .to raise_error(ArgumentError, /can only be used for storing application secrets/)
38
- end
39
- end
40
-
41
- describe "secret_matches?" do
42
- it "compares input with #transform_secret" do
43
- expect(subject.secret_matches?("input", "input")).to eq false
44
-
45
- password = BCrypt::Password.create "foobar"
46
- expect(subject.secret_matches?("foobar", password.to_s)).to eq true
47
- end
48
- end
49
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe ::Doorkeeper::SecretStoring::Plain do
6
- subject { described_class }
7
- let(:instance) { double("instance", token: "foo") }
8
-
9
- describe "#transform_secret" do
10
- it "raises" do
11
- expect(subject.transform_secret("foo")).to eq "foo"
12
- end
13
- end
14
-
15
- describe "#restore_secret" do
16
- it "raises" do
17
- expect(subject.restore_secret(instance, :token)).to eq "foo"
18
- end
19
- end
20
-
21
- describe "#allows_restoring_secrets?" do
22
- it "does allow it" do
23
- expect(subject.allows_restoring_secrets?).to eq true
24
- end
25
- end
26
-
27
- describe "validate_for" do
28
- it "allows for valid model" do
29
- expect(subject.validate_for(:application)).to eq true
30
- expect(subject.validate_for(:token)).to eq true
31
- end
32
-
33
- it "raises for invalid model" do
34
- expect { subject.validate_for(:wat) }.to raise_error(ArgumentError, /can not be used for wat/)
35
- end
36
- end
37
-
38
- describe "secret_matches?" do
39
- it "compares input with #transform_secret" do
40
- expect(subject.secret_matches?("input", "input")).to eq true
41
- expect(subject.secret_matches?("a", "b")).to eq false
42
- end
43
- end
44
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe ::Doorkeeper::SecretStoring::Sha256Hash do
6
- subject { described_class }
7
- let(:instance) { double("instance") }
8
-
9
- let(:hash_function) do
10
- ->(input) { ::Digest::SHA256.hexdigest(input) }
11
- end
12
-
13
- describe "#transform_secret" do
14
- it "raises" do
15
- expect(subject.transform_secret("foo")).to eq hash_function.call("foo")
16
- end
17
- end
18
-
19
- describe "#restore_secret" do
20
- it "raises" do
21
- expect { subject.restore_secret(instance, :token) }.to raise_error(NotImplementedError)
22
- end
23
- end
24
-
25
- describe "#allows_restoring_secrets?" do
26
- it "does not allow it" do
27
- expect(subject.allows_restoring_secrets?).to eq false
28
- end
29
- end
30
-
31
- describe "validate_for" do
32
- it "allows for valid model" do
33
- expect(subject.validate_for(:application)).to eq true
34
- expect(subject.validate_for(:token)).to eq true
35
- end
36
-
37
- it "raises for invalid model" do
38
- expect { subject.validate_for(:wat) }.to raise_error(ArgumentError, /can not be used for wat/)
39
- end
40
- end
41
-
42
- describe "secret_matches?" do
43
- it "compares input with #transform_secret" do
44
- expect(subject.secret_matches?("input", "input")).to eq false
45
- expect(subject.secret_matches?("a", hash_function.call("a"))).to eq true
46
- end
47
- end
48
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::Server do
6
- let(:fake_class) { double :fake_class }
7
-
8
- subject do
9
- described_class.new
10
- end
11
-
12
- describe ".authorization_request" do
13
- it "raises error when strategy does not match phase" do
14
- expect do
15
- subject.token_request(:code)
16
- end.to raise_error(Doorkeeper::Errors::InvalidTokenStrategy)
17
- end
18
-
19
- context "when only Authorization Code strategy is enabled" do
20
- before do
21
- allow(Doorkeeper.configuration)
22
- .to receive(:grant_flows)
23
- .and_return(["authorization_code"])
24
- end
25
-
26
- it "raises error when using the disabled Client Credentials strategy" do
27
- expect do
28
- subject.token_request(:client_credentials)
29
- end.to raise_error(Doorkeeper::Errors::InvalidTokenStrategy)
30
- end
31
- end
32
-
33
- it "builds the request with selected strategy" do
34
- stub_const "Doorkeeper::Request::Code", fake_class
35
- expect(fake_class).to receive(:new).with(subject)
36
- subject.authorization_request :code
37
- end
38
-
39
- it "builds the request with composite strategy name" do
40
- allow(Doorkeeper.configuration)
41
- .to receive(:authorization_response_types)
42
- .and_return(["id_token token"])
43
-
44
- stub_const "Doorkeeper::Request::IdTokenToken", fake_class
45
- expect(fake_class).to receive(:new).with(subject)
46
- subject.authorization_request "id_token token"
47
- end
48
- end
49
- end
@@ -1,89 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::StaleRecordsCleaner do
6
- let(:cleaner) { described_class.new(model) }
7
- let(:models_by_name) do
8
- {
9
- access_token: Doorkeeper::AccessToken,
10
- access_grant: Doorkeeper::AccessGrant,
11
- }
12
- end
13
-
14
- context "when ORM has no cleaner class" do
15
- it "raises an error" do
16
- allow_any_instance_of(Doorkeeper::Config).to receive(:orm).and_return("hibernate")
17
-
18
- expect do
19
- described_class.for(Doorkeeper::AccessToken)
20
- end.to raise_error(Doorkeeper::Errors::NoOrmCleaner, /has no cleaner/)
21
- end
22
- end
23
-
24
- %i[access_token access_grant].each do |model_name|
25
- context "(#{model_name})" do
26
- let(:model) { models_by_name.fetch(model_name) }
27
-
28
- describe "#clean_revoked" do
29
- subject { cleaner.clean_revoked }
30
-
31
- context "with revoked record" do
32
- before do
33
- FactoryBot.create model_name, revoked_at: Time.current - 1.minute
34
- end
35
-
36
- it "removes the record" do
37
- expect { subject }.to change { model.count }.to(0)
38
- end
39
- end
40
-
41
- context "with record revoked in the future" do
42
- before do
43
- FactoryBot.create model_name, revoked_at: Time.current + 1.minute
44
- end
45
-
46
- it "keeps the record" do
47
- expect { subject }.not_to(change { model.count })
48
- end
49
- end
50
-
51
- context "with unrevoked record" do
52
- before do
53
- FactoryBot.create model_name, revoked_at: nil
54
- end
55
-
56
- it "keeps the record" do
57
- expect { subject }.not_to(change { model.count })
58
- end
59
- end
60
- end
61
-
62
- describe "#clean_expired" do
63
- subject { cleaner.clean_expired(ttl) }
64
- let(:ttl) { 500 }
65
- let(:expiry_border) { ttl.seconds.ago }
66
-
67
- context "with record that is expired" do
68
- before do
69
- FactoryBot.create model_name, created_at: expiry_border - 1.minute
70
- end
71
-
72
- it "removes the record" do
73
- expect { subject }.to change { model.count }.to(0)
74
- end
75
- end
76
-
77
- context "with record that is not expired" do
78
- before do
79
- FactoryBot.create model_name, created_at: expiry_border + 1.minute
80
- end
81
-
82
- it "keeps the record" do
83
- expect { subject }.not_to(change { model.count })
84
- end
85
- end
86
- end
87
- end
88
- end
89
- end