doorkeeper 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. checksums.yaml +5 -5
  2. data/.hound.yml +2 -1
  3. data/.rubocop.yml +37 -4
  4. data/.travis.yml +16 -21
  5. data/Appraisals +29 -7
  6. data/Dangerfile +67 -0
  7. data/Gemfile +19 -5
  8. data/NEWS.md +107 -10
  9. data/README.md +75 -470
  10. data/Rakefile +10 -8
  11. data/app/controllers/doorkeeper/application_controller.rb +3 -2
  12. data/app/controllers/doorkeeper/application_metal_controller.rb +4 -13
  13. data/app/controllers/doorkeeper/applications_controller.rb +21 -7
  14. data/app/controllers/doorkeeper/authorizations_controller.rb +3 -3
  15. data/app/controllers/doorkeeper/authorized_applications_controller.rb +2 -0
  16. data/app/controllers/doorkeeper/token_info_controller.rb +4 -2
  17. data/app/controllers/doorkeeper/tokens_controller.rb +13 -11
  18. data/app/helpers/doorkeeper/dashboard_helper.rb +3 -1
  19. data/app/validators/redirect_uri_validator.rb +7 -2
  20. data/app/views/doorkeeper/applications/_form.html.erb +6 -0
  21. data/app/views/doorkeeper/applications/show.html.erb +1 -1
  22. data/app/views/layouts/doorkeeper/admin.html.erb +5 -3
  23. data/bin/console +16 -0
  24. data/config/locales/en.yml +1 -0
  25. data/doorkeeper.gemspec +28 -24
  26. data/gemfiles/rails_5_0.gemfile +9 -4
  27. data/gemfiles/rails_5_1.gemfile +9 -4
  28. data/gemfiles/rails_5_2.gemfile +10 -5
  29. data/gemfiles/rails_6_0.gemfile +17 -0
  30. data/gemfiles/rails_master.gemfile +9 -9
  31. data/lib/doorkeeper/config/option.rb +64 -0
  32. data/lib/doorkeeper/config.rb +197 -76
  33. data/lib/doorkeeper/engine.rb +3 -1
  34. data/lib/doorkeeper/errors.rb +17 -0
  35. data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
  36. data/lib/doorkeeper/grape/helpers.rb +5 -3
  37. data/lib/doorkeeper/helpers/controller.rb +5 -2
  38. data/lib/doorkeeper/models/access_grant_mixin.rb +25 -6
  39. data/lib/doorkeeper/models/access_token_mixin.rb +68 -22
  40. data/lib/doorkeeper/models/application_mixin.rb +45 -1
  41. data/lib/doorkeeper/models/concerns/accessible.rb +2 -0
  42. data/lib/doorkeeper/models/concerns/expirable.rb +6 -2
  43. data/lib/doorkeeper/models/concerns/orderable.rb +2 -0
  44. data/lib/doorkeeper/models/concerns/ownership.rb +3 -6
  45. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  46. data/lib/doorkeeper/models/concerns/revocable.rb +4 -1
  47. data/lib/doorkeeper/models/concerns/scopes.rb +7 -1
  48. data/lib/doorkeeper/models/concerns/secret_storable.rb +108 -0
  49. data/lib/doorkeeper/oauth/authorization/code.rb +4 -2
  50. data/lib/doorkeeper/oauth/authorization/context.rb +2 -0
  51. data/lib/doorkeeper/oauth/authorization/token.rb +14 -7
  52. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +3 -1
  53. data/lib/doorkeeper/oauth/authorization_code_request.rb +8 -4
  54. data/lib/doorkeeper/oauth/base_request.rb +2 -0
  55. data/lib/doorkeeper/oauth/base_response.rb +2 -0
  56. data/lib/doorkeeper/oauth/client/credentials.rb +2 -0
  57. data/lib/doorkeeper/oauth/client.rb +3 -1
  58. data/lib/doorkeeper/oauth/client_credentials/creator.rb +2 -0
  59. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +2 -0
  60. data/lib/doorkeeper/oauth/client_credentials/validation.rb +7 -4
  61. data/lib/doorkeeper/oauth/client_credentials_request.rb +3 -1
  62. data/lib/doorkeeper/oauth/code_request.rb +2 -0
  63. data/lib/doorkeeper/oauth/code_response.rb +4 -2
  64. data/lib/doorkeeper/oauth/error.rb +2 -0
  65. data/lib/doorkeeper/oauth/error_response.rb +20 -6
  66. data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
  67. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +25 -8
  68. data/lib/doorkeeper/oauth/helpers/unique_token.rb +15 -1
  69. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +42 -3
  70. data/lib/doorkeeper/oauth/invalid_token_response.rb +22 -0
  71. data/lib/doorkeeper/oauth/password_access_token_request.rb +9 -2
  72. data/lib/doorkeeper/oauth/pre_authorization.rb +13 -5
  73. data/lib/doorkeeper/oauth/refresh_token_request.rb +15 -4
  74. data/lib/doorkeeper/oauth/scopes.rb +7 -3
  75. data/lib/doorkeeper/oauth/token.rb +4 -2
  76. data/lib/doorkeeper/oauth/token_introspection.rb +76 -8
  77. data/lib/doorkeeper/oauth/token_request.rb +2 -0
  78. data/lib/doorkeeper/oauth/token_response.rb +11 -9
  79. data/lib/doorkeeper/oauth.rb +5 -5
  80. data/lib/doorkeeper/orm/active_record/access_grant.rb +27 -13
  81. data/lib/doorkeeper/orm/active_record/access_token.rb +6 -13
  82. data/lib/doorkeeper/orm/active_record/application.rb +26 -7
  83. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +10 -3
  84. data/lib/doorkeeper/orm/active_record.rb +8 -6
  85. data/lib/doorkeeper/rails/helpers.rb +5 -1
  86. data/lib/doorkeeper/rails/routes/mapper.rb +2 -0
  87. data/lib/doorkeeper/rails/routes/mapping.rb +9 -7
  88. data/lib/doorkeeper/rails/routes.rb +19 -12
  89. data/lib/doorkeeper/rake/db.rake +17 -17
  90. data/lib/doorkeeper/rake.rb +1 -1
  91. data/lib/doorkeeper/request/authorization_code.rb +2 -0
  92. data/lib/doorkeeper/request/client_credentials.rb +2 -0
  93. data/lib/doorkeeper/request/code.rb +2 -0
  94. data/lib/doorkeeper/request/password.rb +2 -0
  95. data/lib/doorkeeper/request/refresh_token.rb +2 -0
  96. data/lib/doorkeeper/request/strategy.rb +2 -0
  97. data/lib/doorkeeper/request/token.rb +2 -0
  98. data/lib/doorkeeper/request.rb +3 -1
  99. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  100. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  101. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  102. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  103. data/lib/doorkeeper/server.rb +2 -0
  104. data/lib/doorkeeper/stale_records_cleaner.rb +20 -0
  105. data/lib/doorkeeper/validations.rb +2 -0
  106. data/lib/doorkeeper/version.rb +4 -2
  107. data/lib/doorkeeper.rb +69 -59
  108. data/lib/generators/doorkeeper/application_owner_generator.rb +10 -9
  109. data/lib/generators/doorkeeper/confidential_applications_generator.rb +10 -9
  110. data/lib/generators/doorkeeper/install_generator.rb +11 -9
  111. data/lib/generators/doorkeeper/migration_generator.rb +9 -9
  112. data/lib/generators/doorkeeper/pkce_generator.rb +10 -9
  113. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +10 -9
  114. data/lib/generators/doorkeeper/templates/initializer.rb +138 -13
  115. data/lib/generators/doorkeeper/templates/migration.rb.erb +17 -10
  116. data/lib/generators/doorkeeper/views_generator.rb +6 -4
  117. data/spec/controllers/application_metal_controller_spec.rb +24 -10
  118. data/spec/controllers/applications_controller_spec.rb +76 -78
  119. data/spec/controllers/authorizations_controller_spec.rb +189 -142
  120. data/spec/controllers/protected_resources_controller_spec.rb +111 -67
  121. data/spec/controllers/token_info_controller_spec.rb +14 -12
  122. data/spec/controllers/tokens_controller_spec.rb +170 -112
  123. data/spec/dummy/Rakefile +3 -1
  124. data/spec/dummy/app/controllers/application_controller.rb +3 -1
  125. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +3 -1
  126. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +4 -2
  127. data/spec/dummy/app/controllers/home_controller.rb +6 -5
  128. data/spec/dummy/app/controllers/metal_controller.rb +2 -0
  129. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +4 -2
  130. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  131. data/spec/dummy/app/models/user.rb +2 -0
  132. data/spec/dummy/config/application.rb +26 -2
  133. data/spec/dummy/config/boot.rb +2 -4
  134. data/spec/dummy/config/environment.rb +1 -1
  135. data/spec/dummy/config/environments/development.rb +2 -0
  136. data/spec/dummy/config/environments/production.rb +2 -0
  137. data/spec/dummy/config/environments/test.rb +4 -2
  138. data/spec/dummy/config/initializers/backtrace_silencers.rb +2 -0
  139. data/spec/dummy/config/initializers/doorkeeper.rb +7 -3
  140. data/spec/dummy/config/initializers/secret_token.rb +3 -1
  141. data/spec/dummy/config/initializers/session_store.rb +3 -1
  142. data/spec/dummy/config/initializers/wrap_parameters.rb +2 -0
  143. data/spec/dummy/config.ru +3 -1
  144. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +20 -13
  145. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +1 -1
  146. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +2 -0
  147. data/spec/dummy/db/schema.rb +1 -1
  148. data/spec/dummy/script/rails +7 -4
  149. data/spec/factories.rb +11 -9
  150. data/spec/generators/application_owner_generator_spec.rb +13 -26
  151. data/spec/generators/confidential_applications_generator_spec.rb +12 -28
  152. data/spec/generators/install_generator_spec.rb +19 -14
  153. data/spec/generators/migration_generator_spec.rb +13 -26
  154. data/spec/generators/pkce_generator_spec.rb +11 -26
  155. data/spec/generators/previous_refresh_token_generator_spec.rb +16 -29
  156. data/spec/generators/templates/routes.rb +2 -1
  157. data/spec/generators/views_generator_spec.rb +14 -12
  158. data/spec/grape/grape_integration_spec.rb +35 -33
  159. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +9 -7
  160. data/spec/lib/config_spec.rb +290 -104
  161. data/spec/lib/doorkeeper_spec.rb +8 -6
  162. data/spec/lib/models/expirable_spec.rb +22 -8
  163. data/spec/lib/models/reusable_spec.rb +40 -0
  164. data/spec/lib/models/revocable_spec.rb +8 -6
  165. data/spec/lib/models/scopes_spec.rb +27 -13
  166. data/spec/lib/models/secret_storable_spec.rb +135 -0
  167. data/spec/lib/oauth/authorization/uri_builder_spec.rb +17 -15
  168. data/spec/lib/oauth/authorization_code_request_spec.rb +43 -17
  169. data/spec/lib/oauth/base_request_spec.rb +24 -12
  170. data/spec/lib/oauth/base_response_spec.rb +3 -1
  171. data/spec/lib/oauth/client/credentials_spec.rb +26 -24
  172. data/spec/lib/oauth/client_credentials/creator_spec.rb +56 -10
  173. data/spec/lib/oauth/client_credentials/issuer_spec.rb +27 -20
  174. data/spec/lib/oauth/client_credentials/validation_spec.rb +21 -15
  175. data/spec/lib/oauth/client_credentials_integration_spec.rb +8 -6
  176. data/spec/lib/oauth/client_credentials_request_spec.rb +27 -21
  177. data/spec/lib/oauth/client_spec.rb +15 -13
  178. data/spec/lib/oauth/code_request_spec.rb +10 -8
  179. data/spec/lib/oauth/code_response_spec.rb +9 -7
  180. data/spec/lib/oauth/error_response_spec.rb +19 -11
  181. data/spec/lib/oauth/error_spec.rb +4 -2
  182. data/spec/lib/oauth/forbidden_token_response_spec.rb +7 -5
  183. data/spec/lib/oauth/helpers/scope_checker_spec.rb +68 -31
  184. data/spec/lib/oauth/helpers/unique_token_spec.rb +8 -6
  185. data/spec/lib/oauth/helpers/uri_checker_spec.rb +124 -93
  186. data/spec/lib/oauth/invalid_token_response_spec.rb +3 -1
  187. data/spec/lib/oauth/password_access_token_request_spec.rb +95 -34
  188. data/spec/lib/oauth/pre_authorization_spec.rb +80 -54
  189. data/spec/lib/oauth/refresh_token_request_spec.rb +46 -39
  190. data/spec/lib/oauth/scopes_spec.rb +63 -61
  191. data/spec/lib/oauth/token_request_spec.rb +80 -25
  192. data/spec/lib/oauth/token_response_spec.rb +40 -38
  193. data/spec/lib/oauth/token_spec.rb +64 -45
  194. data/spec/lib/request/strategy_spec.rb +3 -1
  195. data/spec/lib/secret_storing/base_spec.rb +60 -0
  196. data/spec/lib/secret_storing/bcrypt_spec.rb +49 -0
  197. data/spec/lib/secret_storing/plain_spec.rb +44 -0
  198. data/spec/lib/secret_storing/sha256_hash_spec.rb +48 -0
  199. data/spec/lib/server_spec.rb +20 -18
  200. data/spec/lib/{orm/active_record/stale_records_cleaner_spec.rb → stale_records_cleaner_spec.rb} +28 -18
  201. data/spec/models/doorkeeper/access_grant_spec.rb +80 -15
  202. data/spec/models/doorkeeper/access_token_spec.rb +212 -83
  203. data/spec/models/doorkeeper/application_spec.rb +146 -49
  204. data/spec/requests/applications/applications_request_spec.rb +100 -68
  205. data/spec/requests/applications/authorized_applications_spec.rb +20 -18
  206. data/spec/requests/endpoints/authorization_spec.rb +27 -25
  207. data/spec/requests/endpoints/token_spec.rb +38 -36
  208. data/spec/requests/flows/authorization_code_errors_spec.rb +27 -25
  209. data/spec/requests/flows/authorization_code_spec.rb +260 -158
  210. data/spec/requests/flows/client_credentials_spec.rb +54 -52
  211. data/spec/requests/flows/implicit_grant_errors_spec.rb +11 -9
  212. data/spec/requests/flows/implicit_grant_spec.rb +27 -25
  213. data/spec/requests/flows/password_spec.rb +64 -56
  214. data/spec/requests/flows/refresh_token_spec.rb +91 -32
  215. data/spec/requests/flows/revoke_token_spec.rb +49 -63
  216. data/spec/requests/flows/skip_authorization_spec.rb +23 -21
  217. data/spec/requests/protected_resources/metal_spec.rb +7 -5
  218. data/spec/requests/protected_resources/private_api_spec.rb +37 -35
  219. data/spec/routing/custom_controller_routes_spec.rb +71 -65
  220. data/spec/routing/default_routes_spec.rb +22 -20
  221. data/spec/routing/scoped_routes_spec.rb +20 -18
  222. data/spec/spec_helper.rb +15 -13
  223. data/spec/spec_helper_integration.rb +3 -1
  224. data/spec/support/dependencies/factory_bot.rb +3 -1
  225. data/spec/support/doorkeeper_rspec.rb +5 -2
  226. data/spec/support/helpers/access_token_request_helper.rb +3 -1
  227. data/spec/support/helpers/authorization_request_helper.rb +4 -2
  228. data/spec/support/helpers/config_helper.rb +2 -0
  229. data/spec/support/helpers/model_helper.rb +11 -5
  230. data/spec/support/helpers/request_spec_helper.rb +5 -3
  231. data/spec/support/helpers/url_helper.rb +20 -18
  232. data/spec/support/http_method_shim.rb +4 -9
  233. data/spec/support/orm/active_record.rb +3 -1
  234. data/spec/support/shared/controllers_shared_context.rb +68 -10
  235. data/spec/support/shared/hashing_shared_context.rb +36 -0
  236. data/spec/support/shared/models_shared_examples.rb +12 -10
  237. data/spec/validators/redirect_uri_validator_spec.rb +76 -47
  238. data/spec/version/version_spec.rb +7 -5
  239. metadata +70 -21
  240. data/gemfiles/rails_4_2.gemfile +0 -13
  241. data/spec/dummy/config/initializers/new_framework_defaults.rb +0 -10
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  module Request
3
5
  class ClientCredentials < Strategy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  module Request
3
5
  class Code < Strategy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  module Request
3
5
  class Password < Strategy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  module Request
3
5
  class RefreshToken < Strategy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  module Request
3
5
  class Strategy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  module Request
3
5
  class Token < Strategy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  module Request
3
5
  class << self
@@ -31,7 +33,7 @@ module Doorkeeper
31
33
  end
32
34
 
33
35
  def build_strategy_class(grant_or_request_type)
34
- strategy_class_name = grant_or_request_type.to_s.tr(' ', '_').camelize
36
+ strategy_class_name = grant_or_request_type.to_s.tr(" ", "_").camelize
35
37
  "Doorkeeper::Request::#{strategy_class_name}".constantize
36
38
  end
37
39
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doorkeeper
4
+ module SecretStoring
5
+ ##
6
+ # Base class for secret storing, including common helpers
7
+ class Base
8
+ ##
9
+ # Return the value to be stored by the database
10
+ # used for looking up a database value.
11
+ # @param plain_secret The plain secret input / generated
12
+ def self.transform_secret(_plain_secret)
13
+ raise NotImplementedError
14
+ end
15
+
16
+ ##
17
+ # Transform and store the given secret attribute => value
18
+ # pair used for safely storing the attribute
19
+ # @param resource The model instance being modified
20
+ # @param attribute The secret attribute
21
+ # @param plain_secret The plain secret input / generated
22
+ def self.store_secret(resource, attribute, plain_secret)
23
+ transformed_value = transform_secret(plain_secret)
24
+ resource.public_send(:"#{attribute}=", transformed_value)
25
+
26
+ transformed_value
27
+ end
28
+
29
+ ##
30
+ # Return the restored value from the database
31
+ # @param resource The resource instance to act on
32
+ # @param attribute The secret attribute to restore
33
+ # as retrieved from the database.
34
+ def self.restore_secret(_resource, _attribute)
35
+ raise NotImplementedError
36
+ end
37
+
38
+ ##
39
+ # Determines whether this strategy supports restoring
40
+ # secrets from the database. This allows detecting users
41
+ # trying to use a non-restorable strategy with +reuse_access_tokens+.
42
+ def self.allows_restoring_secrets?
43
+ false
44
+ end
45
+
46
+ ##
47
+ # Determines what secrets this strategy is applicable for
48
+ def self.validate_for(model)
49
+ valid = %i[token application]
50
+ return true if valid.include?(model.to_sym)
51
+
52
+ raise ArgumentError, "'#{name}' can not be used for #{model}."
53
+ end
54
+
55
+ ##
56
+ # Securely compare the given +input+ value with a +stored+ value
57
+ # processed by +transform_secret+.
58
+ def self.secret_matches?(input, stored)
59
+ transformed_input = transform_secret(input)
60
+ ActiveSupport::SecurityUtils.secure_compare transformed_input, stored
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doorkeeper
4
+ module SecretStoring
5
+ ##
6
+ # Plain text secret storing, which is the default
7
+ # but also provides fallback lookup if
8
+ # other secret storing mechanisms are enabled.
9
+ class BCrypt < Base
10
+ ##
11
+ # Return the value to be stored by the database
12
+ # @param plain_secret The plain secret input / generated
13
+ def self.transform_secret(plain_secret)
14
+ ::BCrypt::Password.create(plain_secret.to_s)
15
+ end
16
+
17
+ ##
18
+ # Securely compare the given +input+ value with a +stored+ value
19
+ # processed by +transform_secret+.
20
+ def self.secret_matches?(input, stored)
21
+ ::BCrypt::Password.new(stored.to_s) == input.to_s
22
+ rescue ::BCrypt::Errors::InvalidHash
23
+ false
24
+ end
25
+
26
+ ##
27
+ # Determines whether this strategy supports restoring
28
+ # secrets from the database. This allows detecting users
29
+ # trying to use a non-restorable strategy with +reuse_access_tokens+.
30
+ def self.allows_restoring_secrets?
31
+ false
32
+ end
33
+
34
+ ##
35
+ # Determines what secrets this strategy is applicable for
36
+ def self.validate_for(model)
37
+ unless model.to_sym == :application
38
+ raise ArgumentError,
39
+ "'#{name}' can only be used for storing application secrets."
40
+ end
41
+
42
+ unless bcrypt_present?
43
+ raise ArgumentError,
44
+ "'#{name}' requires the 'bcrypt' gem being loaded."
45
+ end
46
+
47
+ true
48
+ end
49
+
50
+ ##
51
+ # Test if we can require the BCrypt gem
52
+ def self.bcrypt_present?
53
+ require "bcrypt"
54
+ true
55
+ rescue LoadError
56
+ false
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doorkeeper
4
+ module SecretStoring
5
+ ##
6
+ # Plain text secret storing, which is the default
7
+ # but also provides fallback lookup if
8
+ # other secret storing mechanisms are enabled.
9
+ class Plain < Base
10
+ ##
11
+ # Return the value to be stored by the database
12
+ # @param plain_secret The plain secret input / generated
13
+ def self.transform_secret(plain_secret)
14
+ plain_secret
15
+ end
16
+
17
+ ##
18
+ # Return the restored value from the database
19
+ # @param resource The resource instance to act on
20
+ # @param attribute The secret attribute to restore
21
+ # as retrieved from the database.
22
+ def self.restore_secret(resource, attribute)
23
+ resource.public_send(attribute)
24
+ end
25
+
26
+ ##
27
+ # Plain values obviously allow restoring
28
+ def self.allows_restoring_secrets?
29
+ true
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doorkeeper
4
+ module SecretStoring
5
+ ##
6
+ # Plain text secret storing, which is the default
7
+ # but also provides fallback lookup if
8
+ # other secret storing mechanisms are enabled.
9
+ class Sha256Hash < Base
10
+ ##
11
+ # Return the value to be stored by the database
12
+ # @param plain_secret The plain secret input / generated
13
+ def self.transform_secret(plain_secret)
14
+ ::Digest::SHA256.hexdigest plain_secret
15
+ end
16
+
17
+ ##
18
+ # Determines whether this strategy supports restoring
19
+ # secrets from the database. This allows detecting users
20
+ # trying to use a non-restorable strategy with +reuse_access_tokens+.
21
+ def self.allows_restoring_secrets?
22
+ false
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  class Server
3
5
  attr_accessor :context
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doorkeeper
4
+ class StaleRecordsCleaner
5
+ CLEANER_CLASS = "StaleRecordsCleaner"
6
+
7
+ def self.for(base_scope)
8
+ orm_adapter = "doorkeeper/orm/#{Doorkeeper.configuration.orm}".classify
9
+
10
+ orm_cleaner = "#{orm_adapter}::#{CLEANER_CLASS}".constantize
11
+ orm_cleaner.new(base_scope)
12
+ rescue NameError
13
+ raise Doorkeeper::Errors::NoOrmCleaner, "'#{Doorkeeper.configuration.orm}' ORM has no cleaner!"
14
+ end
15
+
16
+ def self.new(base_scope)
17
+ self.for(base_scope)
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  module Validations
3
5
  extend ActiveSupport::Concern
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  def self.gem_version
3
5
  Gem::Version.new VERSION::STRING
@@ -6,11 +8,11 @@ module Doorkeeper
6
8
  module VERSION
7
9
  # Semantic versioning
8
10
  MAJOR = 5
9
- MINOR = 0
11
+ MINOR = 1
10
12
  TINY = 0
11
13
  PRE = nil
12
14
 
13
15
  # Full version number
14
- STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
16
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
15
17
  end
16
18
  end
data/lib/doorkeeper.rb CHANGED
@@ -1,74 +1,84 @@
1
- require 'doorkeeper/version'
2
- require 'doorkeeper/engine'
3
- require 'doorkeeper/config'
1
+ # frozen_string_literal: true
4
2
 
5
- require 'doorkeeper/request/strategy'
6
- require 'doorkeeper/request/authorization_code'
7
- require 'doorkeeper/request/client_credentials'
8
- require 'doorkeeper/request/code'
9
- require 'doorkeeper/request/password'
10
- require 'doorkeeper/request/refresh_token'
11
- require 'doorkeeper/request/token'
3
+ require "doorkeeper/version"
4
+ require "doorkeeper/engine"
5
+ require "doorkeeper/config"
12
6
 
13
- require 'doorkeeper/errors'
14
- require 'doorkeeper/server'
15
- require 'doorkeeper/request'
16
- require 'doorkeeper/validations'
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"
17
14
 
18
- require 'doorkeeper/oauth/authorization/code'
19
- require 'doorkeeper/oauth/authorization/context'
20
- require 'doorkeeper/oauth/authorization/token'
21
- require 'doorkeeper/oauth/authorization/uri_builder'
22
- require 'doorkeeper/oauth/helpers/scope_checker'
23
- require 'doorkeeper/oauth/helpers/uri_checker'
24
- require 'doorkeeper/oauth/helpers/unique_token'
15
+ require "doorkeeper/errors"
16
+ require "doorkeeper/server"
17
+ require "doorkeeper/request"
18
+ require "doorkeeper/validations"
25
19
 
26
- require 'doorkeeper/oauth'
27
- require 'doorkeeper/oauth/scopes'
28
- require 'doorkeeper/oauth/error'
29
- require 'doorkeeper/oauth/base_response'
30
- require 'doorkeeper/oauth/code_response'
31
- require 'doorkeeper/oauth/token_response'
32
- require 'doorkeeper/oauth/error_response'
33
- require 'doorkeeper/oauth/pre_authorization'
34
- require 'doorkeeper/oauth/base_request'
35
- require 'doorkeeper/oauth/authorization_code_request'
36
- require 'doorkeeper/oauth/refresh_token_request'
37
- require 'doorkeeper/oauth/password_access_token_request'
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"
38
27
 
39
- require 'doorkeeper/oauth/client_credentials/validation'
40
- require 'doorkeeper/oauth/client_credentials/creator'
41
- require 'doorkeeper/oauth/client_credentials/issuer'
42
- require 'doorkeeper/oauth/client_credentials/validation'
43
- require 'doorkeeper/oauth/client/credentials'
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"
44
40
 
45
- require 'doorkeeper/oauth/client_credentials_request'
46
- require 'doorkeeper/oauth/code_request'
47
- require 'doorkeeper/oauth/token_request'
48
- require 'doorkeeper/oauth/client'
49
- require 'doorkeeper/oauth/token'
50
- require 'doorkeeper/oauth/token_introspection'
51
- require 'doorkeeper/oauth/invalid_token_response'
52
- require 'doorkeeper/oauth/forbidden_token_response'
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"
53
46
 
54
- require 'doorkeeper/models/concerns/orderable'
55
- require 'doorkeeper/models/concerns/scopes'
56
- require 'doorkeeper/models/concerns/expirable'
57
- require 'doorkeeper/models/concerns/revocable'
58
- require 'doorkeeper/models/concerns/accessible'
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"
59
55
 
60
- require 'doorkeeper/models/access_grant_mixin'
61
- require 'doorkeeper/models/access_token_mixin'
62
- require 'doorkeeper/models/application_mixin'
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"
63
60
 
64
- require 'doorkeeper/helpers/controller'
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"
65
68
 
66
- require 'doorkeeper/rails/routes'
67
- require 'doorkeeper/rails/helpers'
69
+ require "doorkeeper/models/access_grant_mixin"
70
+ require "doorkeeper/models/access_token_mixin"
71
+ require "doorkeeper/models/application_mixin"
68
72
 
69
- require 'doorkeeper/rake'
73
+ require "doorkeeper/helpers/controller"
70
74
 
71
- require 'doorkeeper/orm/active_record'
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"
72
82
 
73
83
  module Doorkeeper
74
84
  def self.authenticate(request, methods = Doorkeeper.configuration.access_token_methods)
@@ -1,18 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails/generators'
4
- require 'rails/generators/active_record'
3
+ require "rails/generators"
4
+ require "rails/generators/active_record"
5
5
 
6
6
  module Doorkeeper
7
+ # Generates migration to add reference to owner of the
8
+ # Doorkeeper application.
9
+ #
7
10
  class ApplicationOwnerGenerator < ::Rails::Generators::Base
8
11
  include ::Rails::Generators::Migration
9
- source_root File.expand_path('templates', __dir__)
10
- desc 'Provide support for client application ownership.'
12
+ source_root File.expand_path("templates", __dir__)
13
+ desc "Provide support for client application ownership."
11
14
 
12
15
  def application_owner
13
16
  migration_template(
14
- 'add_owner_to_application_migration.rb.erb',
15
- 'db/migrate/add_owner_to_application.rb',
17
+ "add_owner_to_application_migration.rb.erb",
18
+ "db/migrate/add_owner_to_application.rb",
16
19
  migration_version: migration_version
17
20
  )
18
21
  end
@@ -24,9 +27,7 @@ module Doorkeeper
24
27
  private
25
28
 
26
29
  def migration_version
27
- if ActiveRecord::VERSION::MAJOR >= 5
28
- "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
29
- end
30
+ "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
30
31
  end
31
32
  end
32
33
  end
@@ -1,18 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails/generators'
4
- require 'rails/generators/active_record'
3
+ require "rails/generators"
4
+ require "rails/generators/active_record"
5
5
 
6
6
  module Doorkeeper
7
+ # Generates migration to add confidential column to Doorkeeper
8
+ # applications table.
9
+ #
7
10
  class ConfidentialApplicationsGenerator < ::Rails::Generators::Base
8
11
  include ::Rails::Generators::Migration
9
- source_root File.expand_path('templates', __dir__)
10
- desc 'Add confidential column to Doorkeeper applications'
12
+ source_root File.expand_path("templates", __dir__)
13
+ desc "Add confidential column to Doorkeeper applications"
11
14
 
12
15
  def pkce
13
16
  migration_template(
14
- 'add_confidential_to_applications.rb.erb',
15
- 'db/migrate/add_confidential_to_applications.rb',
17
+ "add_confidential_to_applications.rb.erb",
18
+ "db/migrate/add_confidential_to_applications.rb",
16
19
  migration_version: migration_version
17
20
  )
18
21
  end
@@ -24,9 +27,7 @@ module Doorkeeper
24
27
  private
25
28
 
26
29
  def migration_version
27
- if ActiveRecord::VERSION::MAJOR >= 5
28
- "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
29
- end
30
+ "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
30
31
  end
31
32
  end
32
33
  end
@@ -1,20 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails/generators'
4
- require 'rails/generators/active_record'
3
+ require "rails/generators"
4
+ require "rails/generators/active_record"
5
5
 
6
6
  module Doorkeeper
7
+ # Setup doorkeeper into Rails application: locales, routes, etc.
8
+ #
7
9
  class InstallGenerator < ::Rails::Generators::Base
8
10
  include ::Rails::Generators::Migration
9
- source_root File.expand_path('templates', __dir__)
10
- desc 'Installs Doorkeeper.'
11
+ source_root File.expand_path("templates", __dir__)
12
+ desc "Installs Doorkeeper."
11
13
 
12
14
  def install
13
- template 'initializer.rb', 'config/initializers/doorkeeper.rb'
14
- copy_file File.expand_path('../../../config/locales/en.yml', __dir__),
15
- 'config/locales/doorkeeper.en.yml'
16
- route 'use_doorkeeper'
17
- readme 'README'
15
+ template "initializer.rb", "config/initializers/doorkeeper.rb"
16
+ copy_file File.expand_path("../../../config/locales/en.yml", __dir__),
17
+ "config/locales/doorkeeper.en.yml"
18
+ route "use_doorkeeper"
19
+ readme "README"
18
20
  end
19
21
  end
20
22
  end
@@ -1,18 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails/generators'
4
- require 'rails/generators/active_record'
3
+ require "rails/generators"
4
+ require "rails/generators/active_record"
5
5
 
6
6
  module Doorkeeper
7
+ # Copies main Doorkeeper migration into parent Rails application.
8
+ #
7
9
  class MigrationGenerator < ::Rails::Generators::Base
8
10
  include ::Rails::Generators::Migration
9
- source_root File.expand_path('templates', __dir__)
10
- desc 'Installs Doorkeeper migration file.'
11
+ source_root File.expand_path("templates", __dir__)
12
+ desc "Installs Doorkeeper migration file."
11
13
 
12
14
  def install
13
15
  migration_template(
14
- 'migration.rb.erb',
15
- 'db/migrate/create_doorkeeper_tables.rb',
16
+ "migration.rb.erb",
17
+ "db/migrate/create_doorkeeper_tables.rb",
16
18
  migration_version: migration_version
17
19
  )
18
20
  end
@@ -24,9 +26,7 @@ module Doorkeeper
24
26
  private
25
27
 
26
28
  def migration_version
27
- if ActiveRecord::VERSION::MAJOR >= 5
28
- "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
29
- end
29
+ "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
30
30
  end
31
31
  end
32
32
  end
@@ -1,18 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails/generators'
4
- require 'rails/generators/active_record'
3
+ require "rails/generators"
4
+ require "rails/generators/active_record"
5
5
 
6
6
  module Doorkeeper
7
+ # Generates migration with PKCE required database columns for
8
+ # Doorkeeper tables.
9
+ #
7
10
  class PkceGenerator < ::Rails::Generators::Base
8
11
  include ::Rails::Generators::Migration
9
- source_root File.expand_path('templates', __dir__)
10
- desc 'Provide support for PKCE.'
12
+ source_root File.expand_path("templates", __dir__)
13
+ desc "Provide support for PKCE."
11
14
 
12
15
  def pkce
13
16
  migration_template(
14
- 'enable_pkce_migration.rb.erb',
15
- 'db/migrate/enable_pkce.rb',
17
+ "enable_pkce_migration.rb.erb",
18
+ "db/migrate/enable_pkce.rb",
16
19
  migration_version: migration_version
17
20
  )
18
21
  end
@@ -24,9 +27,7 @@ module Doorkeeper
24
27
  private
25
28
 
26
29
  def migration_version
27
- if ActiveRecord::VERSION::MAJOR >= 5
28
- "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
29
- end
30
+ "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
30
31
  end
31
32
  end
32
33
  end