doorkeeper 5.1.0 → 5.5.1

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 (265) hide show
  1. checksums.yaml +4 -4
  2. data/{NEWS.md → CHANGELOG.md} +242 -25
  3. data/README.md +21 -11
  4. data/app/controllers/doorkeeper/application_controller.rb +3 -2
  5. data/app/controllers/doorkeeper/application_metal_controller.rb +3 -2
  6. data/app/controllers/doorkeeper/applications_controller.rb +8 -7
  7. data/app/controllers/doorkeeper/authorizations_controller.rb +56 -19
  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 +93 -25
  11. data/app/views/doorkeeper/applications/_form.html.erb +1 -7
  12. data/app/views/doorkeeper/applications/show.html.erb +35 -14
  13. data/app/views/doorkeeper/authorizations/form_post.html.erb +11 -0
  14. data/config/locales/en.yml +13 -3
  15. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  16. data/lib/doorkeeper/config/option.rb +20 -2
  17. data/lib/doorkeeper/config/validations.rb +53 -0
  18. data/lib/doorkeeper/config.rb +295 -121
  19. data/lib/doorkeeper/engine.rb +1 -1
  20. data/lib/doorkeeper/errors.rb +13 -18
  21. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  22. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  23. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  24. data/lib/doorkeeper/grant_flow.rb +45 -0
  25. data/lib/doorkeeper/grape/helpers.rb +7 -3
  26. data/lib/doorkeeper/helpers/controller.rb +36 -11
  27. data/lib/doorkeeper/models/access_grant_mixin.rb +22 -18
  28. data/lib/doorkeeper/models/access_token_mixin.rb +194 -51
  29. data/lib/doorkeeper/models/application_mixin.rb +8 -7
  30. data/lib/doorkeeper/models/concerns/ownership.rb +1 -1
  31. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  32. data/lib/doorkeeper/models/concerns/reusable.rb +1 -1
  33. data/lib/doorkeeper/models/concerns/revocable.rb +1 -28
  34. data/lib/doorkeeper/models/concerns/scopes.rb +5 -1
  35. data/lib/doorkeeper/models/concerns/secret_storable.rb +1 -3
  36. data/lib/doorkeeper/oauth/authorization/code.rb +25 -14
  37. data/lib/doorkeeper/oauth/authorization/context.rb +5 -5
  38. data/lib/doorkeeper/oauth/authorization/token.rb +24 -19
  39. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +4 -4
  40. data/lib/doorkeeper/oauth/authorization_code_request.rb +40 -21
  41. data/lib/doorkeeper/oauth/base_request.rb +21 -23
  42. data/lib/doorkeeper/oauth/client/credentials.rb +2 -4
  43. data/lib/doorkeeper/oauth/client.rb +8 -9
  44. data/lib/doorkeeper/oauth/client_credentials/creator.rb +45 -5
  45. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +10 -8
  46. data/lib/doorkeeper/oauth/client_credentials/{validation.rb → validator.rb} +13 -3
  47. data/lib/doorkeeper/oauth/client_credentials_request.rb +8 -7
  48. data/lib/doorkeeper/oauth/code_request.rb +6 -12
  49. data/lib/doorkeeper/oauth/code_response.rb +24 -14
  50. data/lib/doorkeeper/oauth/error.rb +1 -1
  51. data/lib/doorkeeper/oauth/error_response.rb +10 -11
  52. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +8 -12
  53. data/lib/doorkeeper/oauth/helpers/unique_token.rb +8 -5
  54. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +19 -5
  55. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  56. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  57. data/lib/doorkeeper/oauth/invalid_token_response.rb +7 -4
  58. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  59. data/lib/doorkeeper/oauth/password_access_token_request.rb +34 -11
  60. data/lib/doorkeeper/oauth/pre_authorization.rb +111 -42
  61. data/lib/doorkeeper/oauth/refresh_token_request.rb +45 -33
  62. data/lib/doorkeeper/oauth/token.rb +6 -7
  63. data/lib/doorkeeper/oauth/token_introspection.rb +24 -18
  64. data/lib/doorkeeper/oauth/token_request.rb +6 -20
  65. data/lib/doorkeeper/oauth/token_response.rb +1 -1
  66. data/lib/doorkeeper/orm/active_record/access_grant.rb +4 -43
  67. data/lib/doorkeeper/orm/active_record/access_token.rb +4 -35
  68. data/lib/doorkeeper/orm/active_record/application.rb +5 -83
  69. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
  70. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
  71. data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
  72. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  73. data/lib/doorkeeper/orm/active_record.rb +20 -6
  74. data/lib/doorkeeper/rails/helpers.rb +4 -4
  75. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  76. data/lib/doorkeeper/rails/routes/mapper.rb +2 -2
  77. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  78. data/lib/doorkeeper/rails/routes.rb +17 -25
  79. data/lib/doorkeeper/rake/db.rake +6 -6
  80. data/lib/doorkeeper/rake/setup.rake +5 -0
  81. data/lib/doorkeeper/request/authorization_code.rb +5 -3
  82. data/lib/doorkeeper/request/client_credentials.rb +2 -2
  83. data/lib/doorkeeper/request/password.rb +3 -2
  84. data/lib/doorkeeper/request/refresh_token.rb +5 -4
  85. data/lib/doorkeeper/request/strategy.rb +2 -2
  86. data/lib/doorkeeper/request.rb +49 -17
  87. data/lib/doorkeeper/server.rb +7 -11
  88. data/lib/doorkeeper/stale_records_cleaner.rb +6 -2
  89. data/lib/doorkeeper/version.rb +2 -6
  90. data/lib/doorkeeper.rb +114 -79
  91. data/lib/generators/doorkeeper/application_owner_generator.rb +1 -1
  92. data/lib/generators/doorkeeper/confidential_applications_generator.rb +2 -2
  93. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  94. data/lib/generators/doorkeeper/migration_generator.rb +1 -1
  95. data/lib/generators/doorkeeper/pkce_generator.rb +1 -1
  96. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +7 -7
  97. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +3 -1
  98. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
  99. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +2 -0
  100. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  101. data/lib/generators/doorkeeper/templates/initializer.rb +205 -43
  102. data/lib/generators/doorkeeper/templates/migration.rb.erb +18 -6
  103. metadata +45 -312
  104. data/.coveralls.yml +0 -1
  105. data/.github/ISSUE_TEMPLATE.md +0 -25
  106. data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  107. data/.gitignore +0 -20
  108. data/.gitlab-ci.yml +0 -16
  109. data/.hound.yml +0 -3
  110. data/.rspec +0 -1
  111. data/.rubocop.yml +0 -50
  112. data/.travis.yml +0 -35
  113. data/Appraisals +0 -40
  114. data/CODE_OF_CONDUCT.md +0 -46
  115. data/CONTRIBUTING.md +0 -47
  116. data/Dangerfile +0 -67
  117. data/Gemfile +0 -24
  118. data/RELEASING.md +0 -10
  119. data/Rakefile +0 -28
  120. data/SECURITY.md +0 -15
  121. data/UPGRADE.md +0 -2
  122. data/app/validators/redirect_uri_validator.rb +0 -50
  123. data/bin/console +0 -16
  124. data/doorkeeper.gemspec +0 -34
  125. data/gemfiles/rails_5_0.gemfile +0 -17
  126. data/gemfiles/rails_5_1.gemfile +0 -17
  127. data/gemfiles/rails_5_2.gemfile +0 -17
  128. data/gemfiles/rails_6_0.gemfile +0 -17
  129. data/gemfiles/rails_master.gemfile +0 -17
  130. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  131. data/spec/controllers/applications_controller_spec.rb +0 -180
  132. data/spec/controllers/authorizations_controller_spec.rb +0 -527
  133. data/spec/controllers/protected_resources_controller_spec.rb +0 -353
  134. data/spec/controllers/token_info_controller_spec.rb +0 -50
  135. data/spec/controllers/tokens_controller_spec.rb +0 -330
  136. data/spec/dummy/Rakefile +0 -9
  137. data/spec/dummy/app/assets/config/manifest.js +0 -2
  138. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  139. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
  140. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
  141. data/spec/dummy/app/controllers/home_controller.rb +0 -18
  142. data/spec/dummy/app/controllers/metal_controller.rb +0 -13
  143. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
  144. data/spec/dummy/app/helpers/application_helper.rb +0 -7
  145. data/spec/dummy/app/models/user.rb +0 -7
  146. data/spec/dummy/app/views/home/index.html.erb +0 -0
  147. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  148. data/spec/dummy/config/application.rb +0 -47
  149. data/spec/dummy/config/boot.rb +0 -7
  150. data/spec/dummy/config/database.yml +0 -15
  151. data/spec/dummy/config/environment.rb +0 -5
  152. data/spec/dummy/config/environments/development.rb +0 -31
  153. data/spec/dummy/config/environments/production.rb +0 -64
  154. data/spec/dummy/config/environments/test.rb +0 -45
  155. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
  156. data/spec/dummy/config/initializers/doorkeeper.rb +0 -121
  157. data/spec/dummy/config/initializers/secret_token.rb +0 -10
  158. data/spec/dummy/config/initializers/session_store.rb +0 -10
  159. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  160. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  161. data/spec/dummy/config/routes.rb +0 -13
  162. data/spec/dummy/config.ru +0 -6
  163. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  164. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  165. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -69
  166. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  167. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  168. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -8
  169. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -13
  170. data/spec/dummy/db/schema.rb +0 -68
  171. data/spec/dummy/public/404.html +0 -26
  172. data/spec/dummy/public/422.html +0 -26
  173. data/spec/dummy/public/500.html +0 -26
  174. data/spec/dummy/public/favicon.ico +0 -0
  175. data/spec/dummy/script/rails +0 -9
  176. data/spec/factories.rb +0 -30
  177. data/spec/generators/application_owner_generator_spec.rb +0 -28
  178. data/spec/generators/confidential_applications_generator_spec.rb +0 -29
  179. data/spec/generators/install_generator_spec.rb +0 -36
  180. data/spec/generators/migration_generator_spec.rb +0 -28
  181. data/spec/generators/pkce_generator_spec.rb +0 -28
  182. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
  183. data/spec/generators/templates/routes.rb +0 -4
  184. data/spec/generators/views_generator_spec.rb +0 -29
  185. data/spec/grape/grape_integration_spec.rb +0 -137
  186. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  187. data/spec/lib/config_spec.rb +0 -697
  188. data/spec/lib/doorkeeper_spec.rb +0 -27
  189. data/spec/lib/models/expirable_spec.rb +0 -61
  190. data/spec/lib/models/reusable_spec.rb +0 -40
  191. data/spec/lib/models/revocable_spec.rb +0 -59
  192. data/spec/lib/models/scopes_spec.rb +0 -53
  193. data/spec/lib/models/secret_storable_spec.rb +0 -135
  194. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
  195. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -156
  196. data/spec/lib/oauth/base_request_spec.rb +0 -205
  197. data/spec/lib/oauth/base_response_spec.rb +0 -47
  198. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  199. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -94
  200. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -112
  201. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -59
  202. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -29
  203. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -109
  204. data/spec/lib/oauth/client_spec.rb +0 -38
  205. data/spec/lib/oauth/code_request_spec.rb +0 -47
  206. data/spec/lib/oauth/code_response_spec.rb +0 -36
  207. data/spec/lib/oauth/error_response_spec.rb +0 -66
  208. data/spec/lib/oauth/error_spec.rb +0 -23
  209. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -22
  210. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -98
  211. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  212. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -247
  213. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -55
  214. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -192
  215. data/spec/lib/oauth/pre_authorization_spec.rb +0 -215
  216. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -177
  217. data/spec/lib/oauth/scopes_spec.rb +0 -148
  218. data/spec/lib/oauth/token_request_spec.rb +0 -150
  219. data/spec/lib/oauth/token_response_spec.rb +0 -86
  220. data/spec/lib/oauth/token_spec.rb +0 -158
  221. data/spec/lib/request/strategy_spec.rb +0 -54
  222. data/spec/lib/secret_storing/base_spec.rb +0 -60
  223. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
  224. data/spec/lib/secret_storing/plain_spec.rb +0 -44
  225. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
  226. data/spec/lib/server_spec.rb +0 -61
  227. data/spec/lib/stale_records_cleaner_spec.rb +0 -89
  228. data/spec/models/doorkeeper/access_grant_spec.rb +0 -144
  229. data/spec/models/doorkeeper/access_token_spec.rb +0 -591
  230. data/spec/models/doorkeeper/application_spec.rb +0 -367
  231. data/spec/requests/applications/applications_request_spec.rb +0 -259
  232. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  233. data/spec/requests/endpoints/authorization_spec.rb +0 -73
  234. data/spec/requests/endpoints/token_spec.rb +0 -75
  235. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -78
  236. data/spec/requests/flows/authorization_code_spec.rb +0 -447
  237. data/spec/requests/flows/client_credentials_spec.rb +0 -128
  238. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -34
  239. data/spec/requests/flows/implicit_grant_spec.rb +0 -90
  240. data/spec/requests/flows/password_spec.rb +0 -259
  241. data/spec/requests/flows/refresh_token_spec.rb +0 -233
  242. data/spec/requests/flows/revoke_token_spec.rb +0 -143
  243. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  244. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  245. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  246. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  247. data/spec/routing/default_routes_spec.rb +0 -41
  248. data/spec/routing/scoped_routes_spec.rb +0 -47
  249. data/spec/spec_helper.rb +0 -57
  250. data/spec/spec_helper_integration.rb +0 -4
  251. data/spec/support/dependencies/factory_bot.rb +0 -4
  252. data/spec/support/doorkeeper_rspec.rb +0 -22
  253. data/spec/support/helpers/access_token_request_helper.rb +0 -13
  254. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  255. data/spec/support/helpers/config_helper.rb +0 -11
  256. data/spec/support/helpers/model_helper.rb +0 -78
  257. data/spec/support/helpers/request_spec_helper.rb +0 -98
  258. data/spec/support/helpers/url_helper.rb +0 -62
  259. data/spec/support/http_method_shim.rb +0 -29
  260. data/spec/support/orm/active_record.rb +0 -5
  261. data/spec/support/shared/controllers_shared_context.rb +0 -123
  262. data/spec/support/shared/hashing_shared_context.rb +0 -36
  263. data/spec/support/shared/models_shared_examples.rb +0 -54
  264. data/spec/validators/redirect_uri_validator_spec.rb +0 -158
  265. data/spec/version/version_spec.rb +0 -17
@@ -4,37 +4,69 @@ module Doorkeeper
4
4
  module Request
5
5
  class << self
6
6
  def authorization_strategy(response_type)
7
- get_strategy(response_type, authorization_response_types)
8
- rescue NameError
9
- raise Errors::InvalidAuthorizationStrategy
7
+ grant_flow = authorization_flows.detect do |flow|
8
+ flow.matches_response_type?(response_type)
9
+ end
10
+
11
+ if grant_flow
12
+ grant_flow.response_type_strategy
13
+ else
14
+ # [NOTE]: this will be removed in a newer versions of Doorkeeper.
15
+ # For retro-compatibility only
16
+ build_fallback_strategy_class(response_type)
17
+ end
10
18
  end
11
19
 
12
20
  def token_strategy(grant_type)
13
- get_strategy(grant_type, token_grant_types)
14
- rescue NameError
15
- raise Errors::InvalidTokenStrategy
16
- end
21
+ raise Errors::MissingRequiredParameter, :grant_type if grant_type.blank?
22
+
23
+ grant_flow = token_flows.detect do |flow|
24
+ flow.matches_grant_type?(grant_type)
25
+ end
26
+
27
+ if grant_flow
28
+ grant_flow.grant_type_strategy
29
+ else
30
+ # [NOTE]: this will be removed in a newer versions of Doorkeeper.
31
+ # For retro-compatibility only
32
+ raise Errors::InvalidTokenStrategy unless available.include?(grant_type.to_s)
17
33
 
18
- def get_strategy(grant_or_request_type, available)
19
- raise Errors::MissingRequestStrategy if grant_or_request_type.blank?
20
- raise NameError unless available.include?(grant_or_request_type.to_s)
34
+ strategy_class = build_fallback_strategy_class(grant_type)
35
+ raise Errors::InvalidTokenStrategy unless strategy_class
21
36
 
22
- build_strategy_class(grant_or_request_type)
37
+ strategy_class
38
+ end
23
39
  end
24
40
 
25
41
  private
26
42
 
27
- def authorization_response_types
28
- Doorkeeper.configuration.authorization_response_types
43
+ def authorization_flows
44
+ Doorkeeper.configuration.authorization_response_flows
29
45
  end
30
46
 
31
- def token_grant_types
32
- Doorkeeper.configuration.token_grant_types
47
+ def token_flows
48
+ Doorkeeper.configuration.token_grant_flows
33
49
  end
34
50
 
35
- def build_strategy_class(grant_or_request_type)
51
+ # [NOTE]: this will be removed in a newer versions of Doorkeeper.
52
+ # For retro-compatibility only
53
+ def available
54
+ Doorkeeper.config.deprecated_token_grant_types_resolver
55
+ end
56
+
57
+ def build_fallback_strategy_class(grant_or_request_type)
36
58
  strategy_class_name = grant_or_request_type.to_s.tr(" ", "_").camelize
37
- "Doorkeeper::Request::#{strategy_class_name}".constantize
59
+ fallback_strategy = "Doorkeeper::Request::#{strategy_class_name}".constantize
60
+
61
+ ::Kernel.warn <<~WARNING
62
+ [DOORKEEPER] #{fallback_strategy} found using fallback, it must be
63
+ registered using `Doorkeeper::GrantFlow.register(grant_flow_name, **options)`.
64
+ This functionality will be removed in a newer versions of Doorkeeper.
65
+ WARNING
66
+
67
+ fallback_strategy
68
+ rescue NameError
69
+ raise Errors::InvalidTokenStrategy
38
70
  end
39
71
  end
40
72
  end
@@ -2,20 +2,20 @@
2
2
 
3
3
  module Doorkeeper
4
4
  class Server
5
- attr_accessor :context
5
+ attr_reader :context
6
6
 
7
- def initialize(context = nil)
7
+ def initialize(context)
8
8
  @context = context
9
9
  end
10
10
 
11
11
  def authorization_request(strategy)
12
- klass = Request.authorization_strategy strategy
13
- klass.new self
12
+ klass = Request.authorization_strategy(strategy)
13
+ klass.new(self)
14
14
  end
15
15
 
16
16
  def token_request(strategy)
17
- klass = Request.token_strategy strategy
18
- klass.new self
17
+ klass = Request.token_strategy(strategy)
18
+ klass.new(self)
19
19
  end
20
20
 
21
21
  # TODO: context should be the request
@@ -27,10 +27,6 @@ module Doorkeeper
27
27
  @client ||= OAuth::Client.authenticate(credentials)
28
28
  end
29
29
 
30
- def client_via_uid
31
- @client_via_uid ||= OAuth::Client.find(parameters[:client_id])
32
- end
33
-
34
30
  def current_resource_owner
35
31
  context.send :current_resource_owner
36
32
  end
@@ -41,7 +37,7 @@ module Doorkeeper
41
37
  end
42
38
 
43
39
  def credentials
44
- methods = Doorkeeper.configuration.client_credentials_methods
40
+ methods = Doorkeeper.config.client_credentials_methods
45
41
  @credentials ||= OAuth::Client::Credentials.from_request(context.request, *methods)
46
42
  end
47
43
  end
@@ -5,16 +5,20 @@ module Doorkeeper
5
5
  CLEANER_CLASS = "StaleRecordsCleaner"
6
6
 
7
7
  def self.for(base_scope)
8
- orm_adapter = "doorkeeper/orm/#{Doorkeeper.configuration.orm}".classify
8
+ orm_adapter = "doorkeeper/orm/#{configured_orm}".classify
9
9
 
10
10
  orm_cleaner = "#{orm_adapter}::#{CLEANER_CLASS}".constantize
11
11
  orm_cleaner.new(base_scope)
12
12
  rescue NameError
13
- raise Doorkeeper::Errors::NoOrmCleaner, "'#{Doorkeeper.configuration.orm}' ORM has no cleaner!"
13
+ raise Doorkeeper::Errors::NoOrmCleaner, "'#{configured_orm}' ORM has no cleaner!"
14
14
  end
15
15
 
16
16
  def self.new(base_scope)
17
17
  self.for(base_scope)
18
18
  end
19
+
20
+ def self.configured_orm
21
+ Doorkeeper.config.orm
22
+ end
19
23
  end
20
24
  end
@@ -1,15 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Doorkeeper
4
- def self.gem_version
5
- Gem::Version.new VERSION::STRING
6
- end
7
-
8
4
  module VERSION
9
5
  # Semantic versioning
10
6
  MAJOR = 5
11
- MINOR = 1
12
- TINY = 0
7
+ MINOR = 5
8
+ TINY = 1
13
9
  PRE = nil
14
10
 
15
11
  # Full version number
data/lib/doorkeeper.rb CHANGED
@@ -1,87 +1,122 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "doorkeeper/version"
4
- require "doorkeeper/engine"
5
3
  require "doorkeeper/config"
4
+ require "doorkeeper/engine"
6
5
 
7
- require "doorkeeper/request/strategy"
8
- require "doorkeeper/request/authorization_code"
9
- require "doorkeeper/request/client_credentials"
10
- require "doorkeeper/request/code"
11
- require "doorkeeper/request/password"
12
- require "doorkeeper/request/refresh_token"
13
- require "doorkeeper/request/token"
14
-
15
- require "doorkeeper/errors"
16
- require "doorkeeper/server"
17
- require "doorkeeper/request"
18
- require "doorkeeper/validations"
19
-
20
- require "doorkeeper/oauth/authorization/code"
21
- require "doorkeeper/oauth/authorization/context"
22
- require "doorkeeper/oauth/authorization/token"
23
- require "doorkeeper/oauth/authorization/uri_builder"
24
- require "doorkeeper/oauth/helpers/scope_checker"
25
- require "doorkeeper/oauth/helpers/uri_checker"
26
- require "doorkeeper/oauth/helpers/unique_token"
27
-
28
- require "doorkeeper/oauth"
29
- require "doorkeeper/oauth/scopes"
30
- require "doorkeeper/oauth/error"
31
- require "doorkeeper/oauth/base_response"
32
- require "doorkeeper/oauth/code_response"
33
- require "doorkeeper/oauth/token_response"
34
- require "doorkeeper/oauth/error_response"
35
- require "doorkeeper/oauth/pre_authorization"
36
- require "doorkeeper/oauth/base_request"
37
- require "doorkeeper/oauth/authorization_code_request"
38
- require "doorkeeper/oauth/refresh_token_request"
39
- require "doorkeeper/oauth/password_access_token_request"
40
-
41
- require "doorkeeper/oauth/client_credentials/validation"
42
- require "doorkeeper/oauth/client_credentials/creator"
43
- require "doorkeeper/oauth/client_credentials/issuer"
44
- require "doorkeeper/oauth/client_credentials/validation"
45
- require "doorkeeper/oauth/client/credentials"
46
-
47
- require "doorkeeper/oauth/client_credentials_request"
48
- require "doorkeeper/oauth/code_request"
49
- require "doorkeeper/oauth/token_request"
50
- require "doorkeeper/oauth/client"
51
- require "doorkeeper/oauth/token"
52
- require "doorkeeper/oauth/token_introspection"
53
- require "doorkeeper/oauth/invalid_token_response"
54
- require "doorkeeper/oauth/forbidden_token_response"
55
-
56
- require "doorkeeper/secret_storing/base"
57
- require "doorkeeper/secret_storing/plain"
58
- require "doorkeeper/secret_storing/sha256_hash"
59
- require "doorkeeper/secret_storing/bcrypt"
60
-
61
- require "doorkeeper/models/concerns/orderable"
62
- require "doorkeeper/models/concerns/scopes"
63
- require "doorkeeper/models/concerns/expirable"
64
- require "doorkeeper/models/concerns/reusable"
65
- require "doorkeeper/models/concerns/revocable"
66
- require "doorkeeper/models/concerns/accessible"
67
- require "doorkeeper/models/concerns/secret_storable"
68
-
69
- require "doorkeeper/models/access_grant_mixin"
70
- require "doorkeeper/models/access_token_mixin"
71
- require "doorkeeper/models/application_mixin"
72
-
73
- require "doorkeeper/helpers/controller"
74
-
75
- require "doorkeeper/rails/routes"
76
- require "doorkeeper/rails/helpers"
77
-
78
- require "doorkeeper/rake"
79
- require "doorkeeper/stale_records_cleaner"
80
-
81
- require "doorkeeper/orm/active_record"
82
-
6
+ # Main Doorkeeper namespace.
7
+ #
83
8
  module Doorkeeper
84
- def self.authenticate(request, methods = Doorkeeper.configuration.access_token_methods)
9
+ autoload :Errors, "doorkeeper/errors"
10
+ autoload :GrantFlow, "doorkeeper/grant_flow"
11
+ autoload :OAuth, "doorkeeper/oauth"
12
+ autoload :Rake, "doorkeeper/rake"
13
+ autoload :Request, "doorkeeper/request"
14
+ autoload :Server, "doorkeeper/server"
15
+ autoload :StaleRecordsCleaner, "doorkeeper/stale_records_cleaner"
16
+ autoload :Validations, "doorkeeper/validations"
17
+ autoload :VERSION, "doorkeeper/version"
18
+
19
+ autoload :AccessGrantMixin, "doorkeeper/models/access_grant_mixin"
20
+ autoload :AccessTokenMixin, "doorkeeper/models/access_token_mixin"
21
+ autoload :ApplicationMixin, "doorkeeper/models/application_mixin"
22
+
23
+ module Helpers
24
+ autoload :Controller, "doorkeeper/helpers/controller"
25
+ end
26
+
27
+ module Request
28
+ autoload :Strategy, "doorkeeper/request/strategy"
29
+ autoload :AuthorizationCode, "doorkeeper/request/authorization_code"
30
+ autoload :ClientCredentials, "doorkeeper/request/client_credentials"
31
+ autoload :Code, "doorkeeper/request/code"
32
+ autoload :Password, "doorkeeper/request/password"
33
+ autoload :RefreshToken, "doorkeeper/request/refresh_token"
34
+ autoload :Token, "doorkeeper/request/token"
35
+ end
36
+
37
+ module OAuth
38
+ autoload :BaseRequest, "doorkeeper/oauth/base_request"
39
+ autoload :AuthorizationCodeRequest, "doorkeeper/oauth/authorization_code_request"
40
+ autoload :BaseResponse, "doorkeeper/oauth/base_response"
41
+ autoload :CodeResponse, "doorkeeper/oauth/code_response"
42
+ autoload :Client, "doorkeeper/oauth/client"
43
+ autoload :ClientCredentialsRequest, "doorkeeper/oauth/client_credentials_request"
44
+ autoload :CodeRequest, "doorkeeper/oauth/code_request"
45
+ autoload :ErrorResponse, "doorkeeper/oauth/error_response"
46
+ autoload :Error, "doorkeeper/oauth/error"
47
+ autoload :InvalidTokenResponse, "doorkeeper/oauth/invalid_token_response"
48
+ autoload :InvalidRequestResponse, "doorkeeper/oauth/invalid_request_response"
49
+ autoload :ForbiddenTokenResponse, "doorkeeper/oauth/forbidden_token_response"
50
+ autoload :NonStandard, "doorkeeper/oauth/nonstandard"
51
+ autoload :PasswordAccessTokenRequest, "doorkeeper/oauth/password_access_token_request"
52
+ autoload :PreAuthorization, "doorkeeper/oauth/pre_authorization"
53
+ autoload :RefreshTokenRequest, "doorkeeper/oauth/refresh_token_request"
54
+ autoload :Scopes, "doorkeeper/oauth/scopes"
55
+ autoload :Token, "doorkeeper/oauth/token"
56
+ autoload :TokenIntrospection, "doorkeeper/oauth/token_introspection"
57
+ autoload :TokenRequest, "doorkeeper/oauth/token_request"
58
+ autoload :TokenResponse, "doorkeeper/oauth/token_response"
59
+
60
+ module Authorization
61
+ autoload :Code, "doorkeeper/oauth/authorization/code"
62
+ autoload :Context, "doorkeeper/oauth/authorization/context"
63
+ autoload :Token, "doorkeeper/oauth/authorization/token"
64
+ autoload :URIBuilder, "doorkeeper/oauth/authorization/uri_builder"
65
+ end
66
+
67
+ class Client
68
+ autoload :Credentials, "doorkeeper/oauth/client/credentials"
69
+ end
70
+
71
+ module ClientCredentials
72
+ autoload :Validator, "doorkeeper/oauth/client_credentials/validator"
73
+ autoload :Creator, "doorkeeper/oauth/client_credentials/creator"
74
+ autoload :Issuer, "doorkeeper/oauth/client_credentials/issuer"
75
+ end
76
+
77
+ module Helpers
78
+ autoload :ScopeChecker, "doorkeeper/oauth/helpers/scope_checker"
79
+ autoload :URIChecker, "doorkeeper/oauth/helpers/uri_checker"
80
+ autoload :UniqueToken, "doorkeeper/oauth/helpers/unique_token"
81
+ end
82
+
83
+ module Hooks
84
+ autoload :Context, "doorkeeper/oauth/hooks/context"
85
+ end
86
+ end
87
+
88
+ module Models
89
+ autoload :Accessible, "doorkeeper/models/concerns/accessible"
90
+ autoload :Expirable, "doorkeeper/models/concerns/expirable"
91
+ autoload :Orderable, "doorkeeper/models/concerns/orderable"
92
+ autoload :Scopes, "doorkeeper/models/concerns/scopes"
93
+ autoload :Reusable, "doorkeeper/models/concerns/reusable"
94
+ autoload :ResourceOwnerable, "doorkeeper/models/concerns/resource_ownerable"
95
+ autoload :Revocable, "doorkeeper/models/concerns/revocable"
96
+ autoload :SecretStorable, "doorkeeper/models/concerns/secret_storable"
97
+ end
98
+
99
+ module Orm
100
+ autoload :ActiveRecord, "doorkeeper/orm/active_record"
101
+ end
102
+
103
+ module Rails
104
+ autoload :Helpers, "doorkeeper/rails/helpers"
105
+ autoload :Routes, "doorkeeper/rails/routes"
106
+ end
107
+
108
+ module SecretStoring
109
+ autoload :Base, "doorkeeper/secret_storing/base"
110
+ autoload :Plain, "doorkeeper/secret_storing/plain"
111
+ autoload :Sha256Hash, "doorkeeper/secret_storing/sha256_hash"
112
+ autoload :BCrypt, "doorkeeper/secret_storing/bcrypt"
113
+ end
114
+
115
+ def self.authenticate(request, methods = Doorkeeper.config.access_token_methods)
85
116
  OAuth::Token.authenticate(request, *methods)
86
117
  end
118
+
119
+ def self.gem_version
120
+ ::Gem::Version.new(::Doorkeeper::VERSION::STRING)
121
+ end
87
122
  end
@@ -16,7 +16,7 @@ module Doorkeeper
16
16
  migration_template(
17
17
  "add_owner_to_application_migration.rb.erb",
18
18
  "db/migrate/add_owner_to_application.rb",
19
- migration_version: migration_version
19
+ migration_version: migration_version,
20
20
  )
21
21
  end
22
22
 
@@ -12,11 +12,11 @@ module Doorkeeper
12
12
  source_root File.expand_path("templates", __dir__)
13
13
  desc "Add confidential column to Doorkeeper applications"
14
14
 
15
- def pkce
15
+ def confidential_applications
16
16
  migration_template(
17
17
  "add_confidential_to_applications.rb.erb",
18
18
  "db/migrate/add_confidential_to_applications.rb",
19
- migration_version: migration_version
19
+ migration_version: migration_version,
20
20
  )
21
21
  end
22
22
 
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+ require "rails/generators/active_record"
5
+
6
+ module Doorkeeper
7
+ # Generates migration with polymorphic resource owner required
8
+ # database columns for Doorkeeper Access Token and Access Grant
9
+ # models.
10
+ #
11
+ class EnablePolymorphicResourceOwnerGenerator < ::Rails::Generators::Base
12
+ include ::Rails::Generators::Migration
13
+ source_root File.expand_path("templates", __dir__)
14
+ desc "Provide support for polymorphic Resource Owner."
15
+
16
+ def enable_polymorphic_resource_owner
17
+ migration_template(
18
+ "enable_polymorphic_resource_owner_migration.rb.erb",
19
+ "db/migrate/enable_polymorphic_resource_owner.rb",
20
+ migration_version: migration_version,
21
+ )
22
+ gsub_file(
23
+ "config/initializers/doorkeeper.rb",
24
+ "# use_polymorphic_resource_owner",
25
+ "use_polymorphic_resource_owner",
26
+ )
27
+ end
28
+
29
+ def self.next_migration_number(dirname)
30
+ ActiveRecord::Generators::Base.next_migration_number(dirname)
31
+ end
32
+
33
+ private
34
+
35
+ def migration_version
36
+ "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
37
+ end
38
+ end
39
+ end
@@ -15,7 +15,7 @@ module Doorkeeper
15
15
  migration_template(
16
16
  "migration.rb.erb",
17
17
  "db/migrate/create_doorkeeper_tables.rb",
18
- migration_version: migration_version
18
+ migration_version: migration_version,
19
19
  )
20
20
  end
21
21
 
@@ -16,7 +16,7 @@ module Doorkeeper
16
16
  migration_template(
17
17
  "enable_pkce_migration.rb.erb",
18
18
  "db/migrate/enable_pkce.rb",
19
- migration_version: migration_version
19
+ migration_version: migration_version,
20
20
  )
21
21
  end
22
22
 
@@ -17,12 +17,12 @@ module Doorkeeper
17
17
  end
18
18
 
19
19
  def previous_refresh_token
20
- if no_previous_refresh_token_column?
21
- migration_template(
22
- "add_previous_refresh_token_to_access_tokens.rb.erb",
23
- "db/migrate/add_previous_refresh_token_to_access_tokens.rb"
24
- )
25
- end
20
+ return unless no_previous_refresh_token_column?
21
+
22
+ migration_template(
23
+ "add_previous_refresh_token_to_access_tokens.rb.erb",
24
+ "db/migrate/add_previous_refresh_token_to_access_tokens.rb",
25
+ )
26
26
  end
27
27
 
28
28
  private
@@ -34,7 +34,7 @@ module Doorkeeper
34
34
  def no_previous_refresh_token_column?
35
35
  !ActiveRecord::Base.connection.column_exists?(
36
36
  :oauth_access_tokens,
37
- :previous_refresh_token
37
+ :previous_refresh_token,
38
38
  )
39
39
  end
40
40
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddOwnerToApplication < ActiveRecord::Migration<%= migration_version %>
2
4
  def change
3
- add_column :oauth_applications, :owner_id, :integer, null: true
5
+ add_column :oauth_applications, :owner_id, :bigint, null: true
4
6
  add_column :oauth_applications, :owner_type, :string, null: true
5
7
  add_index :oauth_applications, [:owner_id, :owner_type]
6
8
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddPreviousRefreshTokenToAccessTokens < ActiveRecord::Migration<%= migration_version %>
2
4
  def change
3
5
  add_column(
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class EnablePkce < ActiveRecord::Migration<%= migration_version %>
2
4
  def change
3
5
  add_column :oauth_access_grants, :code_challenge, :string, null: true
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EnablePolymorphicResourceOwner < ActiveRecord::Migration<%= migration_version %>
4
+ def change
5
+ add_column :oauth_access_tokens, :resource_owner_type, :string
6
+ add_column :oauth_access_grants, :resource_owner_type, :string
7
+ change_column_null :oauth_access_grants, :resource_owner_type, false
8
+
9
+ add_index :oauth_access_tokens,
10
+ [:resource_owner_id, :resource_owner_type],
11
+ name: 'polymorphic_owner_oauth_access_tokens'
12
+
13
+ add_index :oauth_access_grants,
14
+ [:resource_owner_id, :resource_owner_type],
15
+ name: 'polymorphic_owner_oauth_access_grants'
16
+ end
17
+ end