doorkeeper 5.3.3 → 5.6.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +216 -9
  3. data/README.md +30 -21
  4. data/app/controllers/doorkeeper/application_controller.rb +1 -0
  5. data/app/controllers/doorkeeper/applications_controller.rb +4 -4
  6. data/app/controllers/doorkeeper/authorizations_controller.rb +66 -22
  7. data/app/controllers/doorkeeper/authorized_applications_controller.rb +3 -3
  8. data/app/controllers/doorkeeper/token_info_controller.rb +12 -2
  9. data/app/controllers/doorkeeper/tokens_controller.rb +73 -25
  10. data/app/helpers/doorkeeper/dashboard_helper.rb +1 -1
  11. data/app/views/doorkeeper/applications/_form.html.erb +1 -1
  12. data/app/views/doorkeeper/applications/show.html.erb +35 -14
  13. data/app/views/doorkeeper/authorizations/error.html.erb +3 -1
  14. data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
  15. data/app/views/doorkeeper/authorizations/new.html.erb +16 -14
  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 +182 -134
  21. data/lib/doorkeeper/engine.rb +10 -3
  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 +1 -1
  27. data/lib/doorkeeper/helpers/controller.rb +9 -5
  28. data/lib/doorkeeper/models/access_grant_mixin.rb +22 -19
  29. data/lib/doorkeeper/models/access_token_mixin.rb +115 -52
  30. data/lib/doorkeeper/models/application_mixin.rb +5 -4
  31. data/lib/doorkeeper/models/concerns/expirable.rb +1 -1
  32. data/lib/doorkeeper/models/concerns/expiration_time_sql_math.rb +88 -0
  33. data/lib/doorkeeper/models/concerns/polymorphic_resource_owner.rb +30 -0
  34. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  35. data/lib/doorkeeper/models/concerns/revocable.rb +1 -1
  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 +25 -6
  39. data/lib/doorkeeper/oauth/authorization/context.rb +5 -5
  40. data/lib/doorkeeper/oauth/authorization/token.rb +24 -16
  41. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +4 -4
  42. data/lib/doorkeeper/oauth/authorization_code_request.rb +34 -21
  43. data/lib/doorkeeper/oauth/base_request.rb +19 -26
  44. data/lib/doorkeeper/oauth/client/credentials.rb +2 -4
  45. data/lib/doorkeeper/oauth/client.rb +1 -1
  46. data/lib/doorkeeper/oauth/client_credentials/creator.rb +31 -15
  47. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +4 -2
  48. data/lib/doorkeeper/oauth/client_credentials/validator.rb +5 -4
  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 +22 -12
  52. data/lib/doorkeeper/oauth/error_response.rb +7 -9
  53. data/lib/doorkeeper/oauth/forbidden_token_response.rb +2 -1
  54. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +2 -8
  55. data/lib/doorkeeper/oauth/helpers/unique_token.rb +2 -2
  56. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +4 -22
  57. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  58. data/lib/doorkeeper/oauth/invalid_token_response.rb +2 -2
  59. data/lib/doorkeeper/oauth/password_access_token_request.rb +26 -8
  60. data/lib/doorkeeper/oauth/pre_authorization.rb +65 -33
  61. data/lib/doorkeeper/oauth/refresh_token_request.rb +42 -25
  62. data/lib/doorkeeper/oauth/token.rb +5 -6
  63. data/lib/doorkeeper/oauth/token_introspection.rb +8 -12
  64. data/lib/doorkeeper/oauth/token_request.rb +3 -3
  65. data/lib/doorkeeper/oauth/token_response.rb +2 -3
  66. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +14 -4
  67. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +34 -4
  68. data/lib/doorkeeper/orm/active_record/mixins/application.rb +28 -5
  69. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +6 -1
  70. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +5 -2
  71. data/lib/doorkeeper/orm/active_record.rb +30 -38
  72. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  73. data/lib/doorkeeper/rails/routes/mapper.rb +2 -2
  74. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  75. data/lib/doorkeeper/rails/routes.rb +25 -22
  76. data/lib/doorkeeper/rake/db.rake +3 -3
  77. data/lib/doorkeeper/request/password.rb +1 -0
  78. data/lib/doorkeeper/request/refresh_token.rb +2 -1
  79. data/lib/doorkeeper/request/strategy.rb +2 -2
  80. data/lib/doorkeeper/request.rb +49 -12
  81. data/lib/doorkeeper/server.rb +4 -4
  82. data/lib/doorkeeper/stale_records_cleaner.rb +4 -4
  83. data/lib/doorkeeper/version.rb +2 -6
  84. data/lib/doorkeeper.rb +181 -81
  85. data/lib/generators/doorkeeper/confidential_applications_generator.rb +1 -1
  86. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  87. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +3 -1
  88. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
  89. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +2 -0
  90. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  91. data/lib/generators/doorkeeper/templates/initializer.rb +73 -17
  92. data/lib/generators/doorkeeper/templates/migration.rb.erb +28 -9
  93. metadata +48 -316
  94. data/Appraisals +0 -40
  95. data/CODE_OF_CONDUCT.md +0 -46
  96. data/CONTRIBUTING.md +0 -49
  97. data/Dangerfile +0 -67
  98. data/Dockerfile +0 -29
  99. data/Gemfile +0 -25
  100. data/NEWS.md +0 -1
  101. data/RELEASING.md +0 -11
  102. data/Rakefile +0 -28
  103. data/SECURITY.md +0 -15
  104. data/UPGRADE.md +0 -2
  105. data/bin/console +0 -16
  106. data/doorkeeper.gemspec +0 -42
  107. data/gemfiles/rails_5_0.gemfile +0 -18
  108. data/gemfiles/rails_5_1.gemfile +0 -18
  109. data/gemfiles/rails_5_2.gemfile +0 -18
  110. data/gemfiles/rails_6_0.gemfile +0 -18
  111. data/gemfiles/rails_master.gemfile +0 -18
  112. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  113. data/spec/controllers/applications_controller_spec.rb +0 -274
  114. data/spec/controllers/authorizations_controller_spec.rb +0 -608
  115. data/spec/controllers/protected_resources_controller_spec.rb +0 -361
  116. data/spec/controllers/token_info_controller_spec.rb +0 -50
  117. data/spec/controllers/tokens_controller_spec.rb +0 -498
  118. data/spec/dummy/Rakefile +0 -9
  119. data/spec/dummy/app/assets/config/manifest.js +0 -2
  120. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  121. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
  122. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
  123. data/spec/dummy/app/controllers/home_controller.rb +0 -18
  124. data/spec/dummy/app/controllers/metal_controller.rb +0 -13
  125. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
  126. data/spec/dummy/app/helpers/application_helper.rb +0 -7
  127. data/spec/dummy/app/models/user.rb +0 -7
  128. data/spec/dummy/app/views/home/index.html.erb +0 -0
  129. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  130. data/spec/dummy/config/application.rb +0 -49
  131. data/spec/dummy/config/boot.rb +0 -7
  132. data/spec/dummy/config/database.yml +0 -15
  133. data/spec/dummy/config/environment.rb +0 -5
  134. data/spec/dummy/config/environments/development.rb +0 -31
  135. data/spec/dummy/config/environments/production.rb +0 -64
  136. data/spec/dummy/config/environments/test.rb +0 -45
  137. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
  138. data/spec/dummy/config/initializers/doorkeeper.rb +0 -166
  139. data/spec/dummy/config/initializers/secret_token.rb +0 -10
  140. data/spec/dummy/config/initializers/session_store.rb +0 -10
  141. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  142. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  143. data/spec/dummy/config/routes.rb +0 -13
  144. data/spec/dummy/config.ru +0 -6
  145. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  146. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  147. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -69
  148. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  149. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  150. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -8
  151. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -13
  152. data/spec/dummy/db/schema.rb +0 -68
  153. data/spec/dummy/public/404.html +0 -26
  154. data/spec/dummy/public/422.html +0 -26
  155. data/spec/dummy/public/500.html +0 -26
  156. data/spec/dummy/public/favicon.ico +0 -0
  157. data/spec/dummy/script/rails +0 -9
  158. data/spec/factories.rb +0 -30
  159. data/spec/generators/application_owner_generator_spec.rb +0 -28
  160. data/spec/generators/confidential_applications_generator_spec.rb +0 -29
  161. data/spec/generators/install_generator_spec.rb +0 -36
  162. data/spec/generators/migration_generator_spec.rb +0 -28
  163. data/spec/generators/pkce_generator_spec.rb +0 -28
  164. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
  165. data/spec/generators/templates/routes.rb +0 -4
  166. data/spec/generators/views_generator_spec.rb +0 -29
  167. data/spec/grape/grape_integration_spec.rb +0 -137
  168. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  169. data/spec/lib/config_spec.rb +0 -809
  170. data/spec/lib/doorkeeper_spec.rb +0 -27
  171. data/spec/lib/models/expirable_spec.rb +0 -61
  172. data/spec/lib/models/reusable_spec.rb +0 -40
  173. data/spec/lib/models/revocable_spec.rb +0 -59
  174. data/spec/lib/models/scopes_spec.rb +0 -53
  175. data/spec/lib/models/secret_storable_spec.rb +0 -135
  176. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
  177. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -170
  178. data/spec/lib/oauth/base_request_spec.rb +0 -224
  179. data/spec/lib/oauth/base_response_spec.rb +0 -45
  180. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  181. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -134
  182. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -112
  183. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -59
  184. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  185. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -107
  186. data/spec/lib/oauth/client_spec.rb +0 -38
  187. data/spec/lib/oauth/code_request_spec.rb +0 -46
  188. data/spec/lib/oauth/code_response_spec.rb +0 -32
  189. data/spec/lib/oauth/error_response_spec.rb +0 -64
  190. data/spec/lib/oauth/error_spec.rb +0 -21
  191. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -20
  192. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -110
  193. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  194. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -262
  195. data/spec/lib/oauth/invalid_request_response_spec.rb +0 -73
  196. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -53
  197. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -190
  198. data/spec/lib/oauth/pre_authorization_spec.rb +0 -223
  199. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -177
  200. data/spec/lib/oauth/scopes_spec.rb +0 -146
  201. data/spec/lib/oauth/token_request_spec.rb +0 -157
  202. data/spec/lib/oauth/token_response_spec.rb +0 -84
  203. data/spec/lib/oauth/token_spec.rb +0 -156
  204. data/spec/lib/request/strategy_spec.rb +0 -54
  205. data/spec/lib/secret_storing/base_spec.rb +0 -60
  206. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
  207. data/spec/lib/secret_storing/plain_spec.rb +0 -44
  208. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
  209. data/spec/lib/server_spec.rb +0 -49
  210. data/spec/lib/stale_records_cleaner_spec.rb +0 -89
  211. data/spec/models/doorkeeper/access_grant_spec.rb +0 -161
  212. data/spec/models/doorkeeper/access_token_spec.rb +0 -622
  213. data/spec/models/doorkeeper/application_spec.rb +0 -482
  214. data/spec/requests/applications/applications_request_spec.rb +0 -259
  215. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  216. data/spec/requests/endpoints/authorization_spec.rb +0 -91
  217. data/spec/requests/endpoints/token_spec.rb +0 -75
  218. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -79
  219. data/spec/requests/flows/authorization_code_spec.rb +0 -525
  220. data/spec/requests/flows/client_credentials_spec.rb +0 -166
  221. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -46
  222. data/spec/requests/flows/implicit_grant_spec.rb +0 -91
  223. data/spec/requests/flows/password_spec.rb +0 -316
  224. data/spec/requests/flows/refresh_token_spec.rb +0 -233
  225. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  226. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  227. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  228. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  229. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  230. data/spec/routing/default_routes_spec.rb +0 -41
  231. data/spec/routing/scoped_routes_spec.rb +0 -47
  232. data/spec/spec_helper.rb +0 -54
  233. data/spec/spec_helper_integration.rb +0 -4
  234. data/spec/support/dependencies/factory_bot.rb +0 -4
  235. data/spec/support/doorkeeper_rspec.rb +0 -22
  236. data/spec/support/helpers/access_token_request_helper.rb +0 -13
  237. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  238. data/spec/support/helpers/config_helper.rb +0 -11
  239. data/spec/support/helpers/model_helper.rb +0 -78
  240. data/spec/support/helpers/request_spec_helper.rb +0 -110
  241. data/spec/support/helpers/url_helper.rb +0 -62
  242. data/spec/support/orm/active_record.rb +0 -5
  243. data/spec/support/shared/controllers_shared_context.rb +0 -133
  244. data/spec/support/shared/hashing_shared_context.rb +0 -36
  245. data/spec/support/shared/models_shared_examples.rb +0 -54
  246. data/spec/validators/redirect_uri_validator_spec.rb +0 -183
  247. data/spec/version/version_spec.rb +0 -17
@@ -1,809 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper, "configuration" do
6
- subject { Doorkeeper.configuration }
7
-
8
- describe "resource_owner_authenticator" do
9
- it "sets the block that is accessible via authenticate_resource_owner" do
10
- block = proc {}
11
- Doorkeeper.configure do
12
- orm DOORKEEPER_ORM
13
- resource_owner_authenticator(&block)
14
- end
15
-
16
- expect(subject.authenticate_resource_owner).to eq(block)
17
- end
18
-
19
- it "prints warning message by default" do
20
- Doorkeeper.configure do
21
- orm DOORKEEPER_ORM
22
- end
23
-
24
- expect(Rails.logger).to receive(:warn).with(
25
- I18n.t("doorkeeper.errors.messages.resource_owner_authenticator_not_configured"),
26
- )
27
- subject.authenticate_resource_owner.call(nil)
28
- end
29
- end
30
-
31
- describe "resource_owner_from_credentials" do
32
- it "sets the block that is accessible via authenticate_resource_owner" do
33
- block = proc {}
34
- Doorkeeper.configure do
35
- orm DOORKEEPER_ORM
36
- resource_owner_from_credentials(&block)
37
- end
38
-
39
- expect(subject.resource_owner_from_credentials).to eq(block)
40
- end
41
-
42
- it "prints warning message by default" do
43
- Doorkeeper.configure do
44
- orm DOORKEEPER_ORM
45
- end
46
-
47
- expect(Rails.logger).to receive(:warn).with(
48
- I18n.t("doorkeeper.errors.messages.credential_flow_not_configured"),
49
- )
50
- subject.resource_owner_from_credentials.call(nil)
51
- end
52
- end
53
-
54
- describe "setup_orm_adapter" do
55
- it "adds specific error message to NameError exception" do
56
- expect do
57
- Doorkeeper.configure { orm "hibernate" }
58
- end.to raise_error(NameError, /ORM adapter not found \(hibernate\)/)
59
- end
60
-
61
- it "does not change other exceptions" do
62
- allow(Doorkeeper).to receive(:setup_orm_adapter) { raise NoMethodError }
63
-
64
- expect do
65
- Doorkeeper.configure { orm "hibernate" }
66
- end.to raise_error(NoMethodError)
67
- end
68
- end
69
-
70
- describe "admin_authenticator" do
71
- it "sets the block that is accessible via authenticate_admin" do
72
- default_behaviour = "default behaviour"
73
- allow(Doorkeeper::Config).to receive(:head).and_return(default_behaviour)
74
-
75
- Doorkeeper.configure do
76
- orm DOORKEEPER_ORM
77
- end
78
-
79
- expect(subject.authenticate_admin.call({})).to eq(default_behaviour)
80
- end
81
-
82
- it "sets the block that is accessible via authenticate_admin" do
83
- block = proc {}
84
- Doorkeeper.configure do
85
- orm DOORKEEPER_ORM
86
- admin_authenticator(&block)
87
- end
88
-
89
- expect(subject.authenticate_admin).to eq(block)
90
- end
91
- end
92
-
93
- describe "access_token_expires_in" do
94
- it "has 2 hours by default" do
95
- expect(subject.access_token_expires_in).to eq(2.hours)
96
- end
97
-
98
- it "can change the value" do
99
- Doorkeeper.configure do
100
- orm DOORKEEPER_ORM
101
- access_token_expires_in 4.hours
102
- end
103
- expect(subject.access_token_expires_in).to eq(4.hours)
104
- end
105
-
106
- it "can be set to nil" do
107
- Doorkeeper.configure do
108
- orm DOORKEEPER_ORM
109
- access_token_expires_in nil
110
- end
111
-
112
- expect(subject.access_token_expires_in).to be_nil
113
- end
114
- end
115
-
116
- describe "scopes" do
117
- it "has default scopes" do
118
- Doorkeeper.configure do
119
- orm DOORKEEPER_ORM
120
- default_scopes :public
121
- end
122
-
123
- expect(subject.default_scopes).to include("public")
124
- end
125
-
126
- it "has optional scopes" do
127
- Doorkeeper.configure do
128
- orm DOORKEEPER_ORM
129
- optional_scopes :write, :update
130
- end
131
-
132
- expect(subject.optional_scopes).to include("write", "update")
133
- end
134
-
135
- it "has all scopes" do
136
- Doorkeeper.configure do
137
- orm DOORKEEPER_ORM
138
- default_scopes :normal
139
- optional_scopes :admin
140
- end
141
-
142
- expect(subject.scopes).to include("normal", "admin")
143
- end
144
- end
145
-
146
- describe "scopes_by_grant_type" do
147
- it "is {} by default" do
148
- expect(subject.scopes_by_grant_type).to eq({})
149
- end
150
-
151
- it "has hash value" do
152
- hash = {}
153
- Doorkeeper.configure do
154
- orm DOORKEEPER_ORM
155
- scopes_by_grant_type hash
156
- end
157
-
158
- expect(subject.scopes_by_grant_type).to eq(hash)
159
- end
160
- end
161
-
162
- describe "use_refresh_token" do
163
- it "is false by default" do
164
- expect(subject.refresh_token_enabled?).to eq(false)
165
- end
166
-
167
- it "can change the value" do
168
- Doorkeeper.configure do
169
- orm DOORKEEPER_ORM
170
- use_refresh_token
171
- end
172
-
173
- expect(subject.refresh_token_enabled?).to eq(true)
174
- end
175
-
176
- it "can accept a boolean parameter" do
177
- Doorkeeper.configure do
178
- orm DOORKEEPER_ORM
179
- use_refresh_token false
180
- end
181
-
182
- expect(subject.refresh_token_enabled?).to eq(false)
183
- end
184
-
185
- it "can accept a block parameter" do
186
- Doorkeeper.configure do
187
- orm DOORKEEPER_ORM
188
- use_refresh_token { |_context| nil }
189
- end
190
-
191
- expect(subject.refresh_token_enabled?).to be_a(Proc)
192
- end
193
-
194
- it "does not includes 'refresh_token' in authorization_response_types" do
195
- expect(subject.token_grant_types).not_to include "refresh_token"
196
- end
197
-
198
- context "is enabled" do
199
- before do
200
- Doorkeeper.configure do
201
- orm DOORKEEPER_ORM
202
- use_refresh_token
203
- end
204
- end
205
-
206
- it "includes 'refresh_token' in authorization_response_types" do
207
- expect(subject.token_grant_types).to include "refresh_token"
208
- end
209
- end
210
- end
211
-
212
- describe "token_reuse_limit" do
213
- it "is 100 by default" do
214
- expect(subject.token_reuse_limit).to eq(100)
215
- end
216
-
217
- it "can change the value" do
218
- Doorkeeper.configure do
219
- token_reuse_limit 90
220
- end
221
-
222
- expect(subject.token_reuse_limit).to eq(90)
223
- end
224
-
225
- it "sets the value to 100 if invalid value is being set" do
226
- expect(Rails.logger).to receive(:warn).with(/will be set to default 100/)
227
-
228
- Doorkeeper.configure do
229
- reuse_access_token
230
- token_reuse_limit 110
231
- end
232
-
233
- expect(subject.token_reuse_limit).to eq(100)
234
- end
235
- end
236
-
237
- describe "enforce_configured_scopes" do
238
- it "is false by default" do
239
- expect(subject.enforce_configured_scopes?).to eq(false)
240
- end
241
-
242
- it "can change the value" do
243
- Doorkeeper.configure do
244
- orm DOORKEEPER_ORM
245
- enforce_configured_scopes
246
- end
247
-
248
- expect(subject.enforce_configured_scopes?).to eq(true)
249
- end
250
- end
251
-
252
- describe "client_credentials" do
253
- it "has defaults order" do
254
- expect(subject.client_credentials_methods)
255
- .to eq(%i[from_basic from_params])
256
- end
257
-
258
- it "can change the value" do
259
- Doorkeeper.configure do
260
- orm DOORKEEPER_ORM
261
- client_credentials :from_digest, :from_params
262
- end
263
-
264
- expect(subject.client_credentials_methods)
265
- .to eq(%i[from_digest from_params])
266
- end
267
- end
268
-
269
- describe "force_ssl_in_redirect_uri" do
270
- it "is true by default in non-development environments" do
271
- expect(subject.force_ssl_in_redirect_uri).to eq(true)
272
- end
273
-
274
- it "can change the value" do
275
- Doorkeeper.configure do
276
- orm DOORKEEPER_ORM
277
- force_ssl_in_redirect_uri(false)
278
- end
279
-
280
- expect(subject.force_ssl_in_redirect_uri).to eq(false)
281
- end
282
-
283
- it "can be a callable object" do
284
- block = proc { false }
285
- Doorkeeper.configure do
286
- orm DOORKEEPER_ORM
287
- force_ssl_in_redirect_uri(&block)
288
- end
289
-
290
- expect(subject.force_ssl_in_redirect_uri).to eq(block)
291
- expect(subject.force_ssl_in_redirect_uri.call).to eq(false)
292
- end
293
- end
294
-
295
- describe "access_token_methods" do
296
- it "has defaults order" do
297
- expect(subject.access_token_methods)
298
- .to eq(%i[from_bearer_authorization from_access_token_param from_bearer_param])
299
- end
300
-
301
- it "can change the value" do
302
- Doorkeeper.configure do
303
- orm DOORKEEPER_ORM
304
- access_token_methods :from_access_token_param, :from_bearer_param
305
- end
306
-
307
- expect(subject.access_token_methods)
308
- .to eq(%i[from_access_token_param from_bearer_param])
309
- end
310
- end
311
-
312
- describe "forbid_redirect_uri" do
313
- it "is false by default" do
314
- expect(subject.forbid_redirect_uri.call(URI.parse("https://localhost"))).to eq(false)
315
- end
316
-
317
- it "can be a callable object" do
318
- block = proc { true }
319
- Doorkeeper.configure do
320
- orm DOORKEEPER_ORM
321
- forbid_redirect_uri(&block)
322
- end
323
-
324
- expect(subject.forbid_redirect_uri).to eq(block)
325
- expect(subject.forbid_redirect_uri.call).to eq(true)
326
- end
327
- end
328
-
329
- describe "enable_application_owner" do
330
- it "is disabled by default" do
331
- expect(Doorkeeper.configuration.enable_application_owner?).not_to eq(true)
332
- end
333
-
334
- context "when enabled without confirmation" do
335
- before do
336
- Doorkeeper.configure do
337
- orm DOORKEEPER_ORM
338
- enable_application_owner
339
- end
340
- end
341
-
342
- it "adds support for application owner" do
343
- expect(Doorkeeper::Application.new).to respond_to :owner
344
- end
345
-
346
- it "Doorkeeper.configuration.confirm_application_owner? returns false" do
347
- expect(Doorkeeper.configuration.confirm_application_owner?).not_to eq(true)
348
- end
349
- end
350
-
351
- context "when enabled with confirmation set to true" do
352
- before do
353
- Doorkeeper.configure do
354
- orm DOORKEEPER_ORM
355
- enable_application_owner confirmation: true
356
- end
357
- end
358
-
359
- it "adds support for application owner" do
360
- expect(Doorkeeper::Application.new).to respond_to :owner
361
- end
362
-
363
- it "Doorkeeper.configuration.confirm_application_owner? returns true" do
364
- expect(Doorkeeper.configuration.confirm_application_owner?).to eq(true)
365
- end
366
- end
367
- end
368
-
369
- describe "realm" do
370
- it "is 'Doorkeeper' by default" do
371
- expect(Doorkeeper.configuration.realm).to eq("Doorkeeper")
372
- end
373
-
374
- it "can change the value" do
375
- Doorkeeper.configure do
376
- orm DOORKEEPER_ORM
377
- realm "Example"
378
- end
379
-
380
- expect(subject.realm).to eq("Example")
381
- end
382
- end
383
-
384
- describe "grant_flows" do
385
- it "is set to all grant flows by default" do
386
- expect(Doorkeeper.configuration.grant_flows)
387
- .to eq(%w[authorization_code client_credentials])
388
- end
389
-
390
- it "can change the value" do
391
- Doorkeeper.configure do
392
- orm DOORKEEPER_ORM
393
- grant_flows %w[authorization_code implicit]
394
- end
395
-
396
- expect(subject.grant_flows).to eq %w[authorization_code implicit]
397
- end
398
-
399
- context "when including 'authorization_code'" do
400
- before do
401
- Doorkeeper.configure do
402
- orm DOORKEEPER_ORM
403
- grant_flows ["authorization_code"]
404
- end
405
- end
406
-
407
- it "includes 'code' in authorization_response_types" do
408
- expect(subject.authorization_response_types).to include "code"
409
- end
410
-
411
- it "includes 'authorization_code' in token_grant_types" do
412
- expect(subject.token_grant_types).to include "authorization_code"
413
- end
414
- end
415
-
416
- context "when including 'implicit'" do
417
- before do
418
- Doorkeeper.configure do
419
- orm DOORKEEPER_ORM
420
- grant_flows ["implicit"]
421
- end
422
- end
423
-
424
- it "includes 'token' in authorization_response_types" do
425
- expect(subject.authorization_response_types).to include "token"
426
- end
427
- end
428
-
429
- context "when including 'password'" do
430
- before do
431
- Doorkeeper.configure do
432
- orm DOORKEEPER_ORM
433
- grant_flows ["password"]
434
- end
435
- end
436
-
437
- it "includes 'password' in token_grant_types" do
438
- expect(subject.token_grant_types).to include "password"
439
- end
440
- end
441
-
442
- context "when including 'client_credentials'" do
443
- before do
444
- Doorkeeper.configure do
445
- orm DOORKEEPER_ORM
446
- grant_flows ["client_credentials"]
447
- end
448
- end
449
-
450
- it "includes 'client_credentials' in token_grant_types" do
451
- expect(subject.token_grant_types).to include "client_credentials"
452
- end
453
- end
454
- end
455
-
456
- it "raises an exception when configuration is not set" do
457
- old_config = Doorkeeper.configuration
458
- Doorkeeper.module_eval do
459
- @config = nil
460
- end
461
-
462
- expect do
463
- Doorkeeper.configuration
464
- end.to raise_error Doorkeeper::MissingConfiguration
465
-
466
- Doorkeeper.module_eval do
467
- @config = old_config
468
- end
469
- end
470
-
471
- describe "access_token_generator" do
472
- it "is 'Doorkeeper::OAuth::Helpers::UniqueToken' by default" do
473
- expect(Doorkeeper.configuration.access_token_generator).to(
474
- eq("Doorkeeper::OAuth::Helpers::UniqueToken"),
475
- )
476
- end
477
-
478
- it "can change the value" do
479
- Doorkeeper.configure do
480
- orm DOORKEEPER_ORM
481
- access_token_generator "Example"
482
- end
483
- expect(subject.access_token_generator).to eq("Example")
484
- end
485
- end
486
-
487
- describe "default_generator_method" do
488
- it "is :urlsafe_base64 by default" do
489
- expect(Doorkeeper.configuration.default_generator_method)
490
- .to eq(:urlsafe_base64)
491
- end
492
-
493
- it "can change the value" do
494
- Doorkeeper.configure do
495
- orm DOORKEEPER_ORM
496
- default_generator_method :hex
497
- end
498
-
499
- expect(subject.default_generator_method).to eq(:hex)
500
- end
501
- end
502
-
503
- describe "base_controller" do
504
- context "default" do
505
- it { expect(Doorkeeper.configuration.base_controller).to be_an_instance_of(Proc) }
506
-
507
- it "resolves to a ApplicationController::Base in default mode" do
508
- expect(Doorkeeper.configuration.resolve_controller(:base))
509
- .to eq(ActionController::Base)
510
- end
511
-
512
- it "resolves to a ApplicationController::API in api_only mode" do
513
- Doorkeeper.configure do
514
- api_only
515
- end
516
-
517
- expect(Doorkeeper.configuration.resolve_controller(:base))
518
- .to eq(ActionController::API)
519
- end
520
- end
521
-
522
- context "custom" do
523
- before do
524
- Doorkeeper.configure do
525
- orm DOORKEEPER_ORM
526
- base_controller "ApplicationController"
527
- end
528
- end
529
-
530
- it { expect(Doorkeeper.configuration.base_controller).to eq("ApplicationController") }
531
- end
532
- end
533
-
534
- describe "base_metal_controller" do
535
- context "default" do
536
- it { expect(Doorkeeper.configuration.base_metal_controller).to eq("ActionController::API") }
537
- end
538
-
539
- context "custom" do
540
- before do
541
- Doorkeeper.configure do
542
- orm DOORKEEPER_ORM
543
- base_metal_controller { "ApplicationController" }
544
- end
545
- end
546
-
547
- it { expect(Doorkeeper.configuration.resolve_controller(:base_metal)).to eq(ApplicationController) }
548
- end
549
- end
550
-
551
- if DOORKEEPER_ORM == :active_record
552
- class FakeCustomModel; end
553
-
554
- describe "active_record_options" do
555
- let(:models) { [Doorkeeper::AccessGrant, Doorkeeper::AccessToken, Doorkeeper::Application] }
556
-
557
- before do
558
- models.each do |model|
559
- allow(model).to receive(:establish_connection).and_return(true)
560
- end
561
- end
562
-
563
- it "establishes connection for Doorkeeper models based on options" do
564
- models.each do |model|
565
- expect(model).to receive(:establish_connection)
566
- end
567
-
568
- Doorkeeper.configure do
569
- orm DOORKEEPER_ORM
570
- active_record_options(
571
- establish_connection: Rails.configuration.database_configuration[Rails.env],
572
- )
573
- end
574
- end
575
- end
576
-
577
- describe "access_token_class" do
578
- it "uses default doorkeeper value" do
579
- expect(subject.access_token_class).to eq("Doorkeeper::AccessToken")
580
- expect(subject.access_token_model).to be(Doorkeeper::AccessToken)
581
- end
582
-
583
- it "can change the value" do
584
- Doorkeeper.configure do
585
- orm DOORKEEPER_ORM
586
- access_token_class "FakeCustomModel"
587
- end
588
-
589
- expect(subject.access_token_class).to eq("FakeCustomModel")
590
- expect(subject.access_token_model).to be(FakeCustomModel)
591
- end
592
- end
593
-
594
- describe "access_grant_class" do
595
- it "uses default doorkeeper value" do
596
- expect(subject.access_grant_class).to eq("Doorkeeper::AccessGrant")
597
- expect(subject.access_grant_model).to be(Doorkeeper::AccessGrant)
598
- end
599
-
600
- it "can change the value" do
601
- Doorkeeper.configure do
602
- orm DOORKEEPER_ORM
603
- access_grant_class "FakeCustomModel"
604
- end
605
-
606
- expect(subject.access_grant_class).to eq("FakeCustomModel")
607
- expect(subject.access_grant_model).to be(FakeCustomModel)
608
- end
609
- end
610
-
611
- describe "application_class" do
612
- it "uses default doorkeeper value" do
613
- expect(subject.application_class).to eq("Doorkeeper::Application")
614
- expect(subject.application_model).to be(Doorkeeper::Application)
615
- end
616
-
617
- it "can change the value" do
618
- Doorkeeper.configure do
619
- orm DOORKEEPER_ORM
620
- application_class "FakeCustomModel"
621
- end
622
-
623
- expect(subject.application_class).to eq("FakeCustomModel")
624
- expect(subject.application_model).to be(FakeCustomModel)
625
- end
626
- end
627
- end
628
-
629
- describe "api_only" do
630
- it "is false by default" do
631
- expect(subject.api_only).to eq(false)
632
- end
633
-
634
- it "can change the value" do
635
- Doorkeeper.configure do
636
- orm DOORKEEPER_ORM
637
- api_only
638
- end
639
-
640
- expect(subject.api_only).to eq(true)
641
- end
642
- end
643
-
644
- describe "token_lookup_batch_size" do
645
- it "uses default doorkeeper value" do
646
- expect(subject.token_lookup_batch_size).to eq(10_000)
647
- end
648
-
649
- it "can change the value" do
650
- Doorkeeper.configure do
651
- orm DOORKEEPER_ORM
652
- token_lookup_batch_size 100_000
653
- end
654
-
655
- expect(subject.token_lookup_batch_size).to eq(100_000)
656
- end
657
- end
658
-
659
- describe "strict_content_type" do
660
- it "is false by default" do
661
- expect(subject.enforce_content_type).to eq(false)
662
- end
663
-
664
- it "can change the value" do
665
- Doorkeeper.configure do
666
- orm DOORKEEPER_ORM
667
- enforce_content_type
668
- end
669
-
670
- expect(subject.enforce_content_type).to eq(true)
671
- end
672
- end
673
-
674
- describe "handle_auth_errors" do
675
- it "is set to render by default" do
676
- expect(Doorkeeper.configuration.handle_auth_errors).to eq(:render)
677
- end
678
- it "can change the value" do
679
- Doorkeeper.configure do
680
- orm DOORKEEPER_ORM
681
- handle_auth_errors :raise
682
- end
683
- expect(subject.handle_auth_errors).to eq(:raise)
684
- end
685
- end
686
-
687
- describe "token_secret_strategy" do
688
- it "is plain by default" do
689
- expect(subject.token_secret_strategy).to eq(Doorkeeper::SecretStoring::Plain)
690
- expect(subject.token_secret_fallback_strategy).to eq(nil)
691
- end
692
-
693
- context "when provided" do
694
- before do
695
- Doorkeeper.configure do
696
- hash_token_secrets
697
- end
698
- end
699
-
700
- it "will enable hashing for applications" do
701
- expect(subject.token_secret_strategy).to eq(Doorkeeper::SecretStoring::Sha256Hash)
702
- expect(subject.token_secret_fallback_strategy).to eq(nil)
703
- end
704
- end
705
-
706
- context "when manually provided with invalid constant" do
707
- it "raises an exception" do
708
- expect do
709
- Doorkeeper.configure do
710
- hash_token_secrets using: "does not exist"
711
- end
712
- end.to raise_error(NameError)
713
- end
714
- end
715
-
716
- context "when manually provided with invalid option" do
717
- it "raises an exception" do
718
- expect do
719
- Doorkeeper.configure do
720
- hash_token_secrets using: "Doorkeeper::SecretStoring::BCrypt"
721
- end
722
- end.to raise_error(
723
- ArgumentError,
724
- /can only be used for storing application secrets/,
725
- )
726
- end
727
- end
728
-
729
- context "when provided with fallback" do
730
- before do
731
- Doorkeeper.configure do
732
- hash_token_secrets fallback: :plain
733
- end
734
- end
735
-
736
- it "will enable hashing for applications" do
737
- expect(subject.token_secret_strategy).to eq(Doorkeeper::SecretStoring::Sha256Hash)
738
- expect(subject.token_secret_fallback_strategy).to eq(Doorkeeper::SecretStoring::Plain)
739
- end
740
- end
741
-
742
- describe "hash_token_secrets together with reuse_access_token" do
743
- it "will disable reuse_access_token" do
744
- expect(Rails.logger).to receive(:warn).with(/reuse_access_token will be disabled/)
745
-
746
- Doorkeeper.configure do
747
- reuse_access_token
748
- hash_token_secrets
749
- end
750
-
751
- expect(subject.reuse_access_token).to eq(false)
752
- end
753
- end
754
- end
755
-
756
- describe "application_secret_strategy" do
757
- it "is plain by default" do
758
- expect(subject.application_secret_strategy).to eq(Doorkeeper::SecretStoring::Plain)
759
- expect(subject.application_secret_fallback_strategy).to eq(nil)
760
- end
761
-
762
- context "when provided" do
763
- before do
764
- Doorkeeper.configure do
765
- hash_application_secrets
766
- end
767
- end
768
-
769
- it "will enable hashing for applications" do
770
- expect(subject.application_secret_strategy).to eq(Doorkeeper::SecretStoring::Sha256Hash)
771
- expect(subject.application_secret_fallback_strategy).to eq(nil)
772
- end
773
- end
774
-
775
- context "when manually provided with invalid constant" do
776
- it "raises an exception" do
777
- expect do
778
- Doorkeeper.configure do
779
- hash_application_secrets using: "does not exist"
780
- end
781
- end.to raise_error(NameError)
782
- end
783
- end
784
-
785
- context "when provided with fallback" do
786
- before do
787
- Doorkeeper.configure do
788
- hash_application_secrets fallback: :plain
789
- end
790
- end
791
-
792
- it "will enable hashing for applications" do
793
- expect(subject.application_secret_strategy).to eq(Doorkeeper::SecretStoring::Sha256Hash)
794
- expect(subject.application_secret_fallback_strategy).to eq(Doorkeeper::SecretStoring::Plain)
795
- end
796
- end
797
- end
798
-
799
- describe "options deprecation" do
800
- it "prints a warning message when an option is deprecated" do
801
- expect(Kernel).to receive(:warn).with(
802
- "[DOORKEEPER] native_redirect_uri has been deprecated and will soon be removed",
803
- )
804
- Doorkeeper.configure do
805
- native_redirect_uri "urn:ietf:wg:oauth:2.0:oob"
806
- end
807
- end
808
- end
809
- end