doorkeeper 4.2.5 → 5.0.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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +25 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +17 -0
  4. data/.gitignore +2 -1
  5. data/.gitlab-ci.yml +16 -0
  6. data/.hound.yml +2 -13
  7. data/.rubocop.yml +17 -0
  8. data/.travis.yml +19 -4
  9. data/Appraisals +8 -4
  10. data/CODE_OF_CONDUCT.md +46 -0
  11. data/Gemfile +1 -1
  12. data/NEWS.md +115 -0
  13. data/README.md +175 -39
  14. data/RELEASING.md +5 -12
  15. data/Rakefile +6 -0
  16. data/SECURITY.md +15 -0
  17. data/UPGRADE.md +2 -0
  18. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  19. data/app/controllers/doorkeeper/application_controller.rb +2 -5
  20. data/app/controllers/doorkeeper/application_metal_controller.rb +4 -0
  21. data/app/controllers/doorkeeper/applications_controller.rb +47 -13
  22. data/app/controllers/doorkeeper/authorizations_controller.rb +55 -12
  23. data/app/controllers/doorkeeper/authorized_applications_controller.rb +19 -2
  24. data/app/controllers/doorkeeper/tokens_controller.rb +24 -17
  25. data/app/helpers/doorkeeper/dashboard_helper.rb +8 -6
  26. data/app/validators/redirect_uri_validator.rb +13 -2
  27. data/app/views/doorkeeper/applications/_delete_form.html.erb +3 -1
  28. data/app/views/doorkeeper/applications/_form.html.erb +31 -19
  29. data/app/views/doorkeeper/applications/edit.html.erb +1 -1
  30. data/app/views/doorkeeper/applications/index.html.erb +18 -6
  31. data/app/views/doorkeeper/applications/new.html.erb +1 -1
  32. data/app/views/doorkeeper/applications/show.html.erb +8 -5
  33. data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
  34. data/app/views/doorkeeper/authorizations/new.html.erb +5 -1
  35. data/app/views/doorkeeper/authorized_applications/index.html.erb +0 -1
  36. data/app/views/layouts/doorkeeper/admin.html.erb +15 -15
  37. data/config/locales/en.yml +19 -6
  38. data/doorkeeper.gemspec +20 -20
  39. data/gemfiles/rails_4_2.gemfile +6 -4
  40. data/gemfiles/rails_5_0.gemfile +4 -4
  41. data/gemfiles/rails_5_1.gemfile +6 -7
  42. data/gemfiles/rails_5_2.gemfile +12 -0
  43. data/gemfiles/rails_master.gemfile +17 -0
  44. data/lib/doorkeeper/config.rb +123 -71
  45. data/lib/doorkeeper/engine.rb +7 -3
  46. data/lib/doorkeeper/errors.rb +20 -5
  47. data/lib/doorkeeper/grape/helpers.rb +14 -9
  48. data/lib/doorkeeper/helpers/controller.rb +16 -22
  49. data/lib/doorkeeper/models/access_grant_mixin.rb +67 -23
  50. data/lib/doorkeeper/models/access_token_mixin.rb +54 -55
  51. data/lib/doorkeeper/models/application_mixin.rb +16 -30
  52. data/lib/doorkeeper/models/concerns/expirable.rb +7 -5
  53. data/lib/doorkeeper/models/concerns/orderable.rb +13 -0
  54. data/lib/doorkeeper/models/concerns/scopes.rb +1 -1
  55. data/lib/doorkeeper/oauth/authorization/code.rb +31 -8
  56. data/lib/doorkeeper/oauth/authorization/context.rb +15 -0
  57. data/lib/doorkeeper/oauth/authorization/token.rb +46 -20
  58. data/lib/doorkeeper/oauth/authorization_code_request.rb +33 -3
  59. data/lib/doorkeeper/oauth/base_request.rb +23 -7
  60. data/lib/doorkeeper/oauth/client/credentials.rb +6 -4
  61. data/lib/doorkeeper/oauth/client.rb +2 -4
  62. data/lib/doorkeeper/oauth/client_credentials/creator.rb +2 -1
  63. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +6 -3
  64. data/lib/doorkeeper/oauth/client_credentials/validation.rb +4 -6
  65. data/lib/doorkeeper/oauth/client_credentials_request.rb +0 -4
  66. data/lib/doorkeeper/oauth/error.rb +2 -2
  67. data/lib/doorkeeper/oauth/error_response.rb +11 -4
  68. data/lib/doorkeeper/oauth/forbidden_token_response.rb +1 -1
  69. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +0 -8
  70. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +15 -0
  71. data/lib/doorkeeper/oauth/invalid_token_response.rb +3 -4
  72. data/lib/doorkeeper/oauth/password_access_token_request.rb +8 -4
  73. data/lib/doorkeeper/oauth/pre_authorization.rb +45 -13
  74. data/lib/doorkeeper/oauth/refresh_token_request.rb +7 -1
  75. data/lib/doorkeeper/oauth/scopes.rb +19 -9
  76. data/lib/doorkeeper/oauth/token.rb +6 -3
  77. data/lib/doorkeeper/oauth/token_introspection.rb +128 -0
  78. data/lib/doorkeeper/oauth/token_response.rb +4 -2
  79. data/lib/doorkeeper/oauth.rb +13 -0
  80. data/lib/doorkeeper/orm/active_record/access_grant.rb +27 -0
  81. data/lib/doorkeeper/orm/active_record/access_token.rb +21 -20
  82. data/lib/doorkeeper/orm/active_record/application.rb +45 -0
  83. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +26 -0
  84. data/lib/doorkeeper/orm/active_record.rb +21 -8
  85. data/lib/doorkeeper/rails/helpers.rb +7 -10
  86. data/lib/doorkeeper/rails/routes.rb +21 -7
  87. data/lib/doorkeeper/rake/db.rake +40 -0
  88. data/lib/doorkeeper/rake/setup.rake +6 -0
  89. data/lib/doorkeeper/rake.rb +14 -0
  90. data/lib/doorkeeper/request/authorization_code.rb +0 -2
  91. data/lib/doorkeeper/request/client_credentials.rb +0 -2
  92. data/lib/doorkeeper/request/code.rb +0 -2
  93. data/lib/doorkeeper/request/password.rb +1 -13
  94. data/lib/doorkeeper/request/refresh_token.rb +0 -2
  95. data/lib/doorkeeper/request/token.rb +0 -2
  96. data/lib/doorkeeper/request.rb +29 -30
  97. data/lib/doorkeeper/validations.rb +3 -2
  98. data/lib/doorkeeper/version.rb +14 -1
  99. data/lib/doorkeeper.rb +21 -17
  100. data/lib/generators/doorkeeper/application_owner_generator.rb +26 -12
  101. data/lib/generators/doorkeeper/confidential_applications_generator.rb +32 -0
  102. data/lib/generators/doorkeeper/install_generator.rb +17 -9
  103. data/lib/generators/doorkeeper/migration_generator.rb +26 -9
  104. data/lib/generators/doorkeeper/pkce_generator.rb +32 -0
  105. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +31 -20
  106. data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
  107. data/lib/generators/doorkeeper/templates/{add_owner_to_application_migration.rb → add_owner_to_application_migration.rb.erb} +1 -1
  108. data/lib/generators/doorkeeper/templates/{add_previous_refresh_token_to_access_tokens.rb → add_previous_refresh_token_to_access_tokens.rb.erb} +1 -1
  109. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +6 -0
  110. data/lib/generators/doorkeeper/templates/initializer.rb +104 -12
  111. data/lib/generators/doorkeeper/templates/{migration.rb → migration.rb.erb} +2 -1
  112. data/lib/generators/doorkeeper/views_generator.rb +3 -1
  113. data/spec/controllers/application_metal_controller_spec.rb +50 -0
  114. data/spec/controllers/applications_controller_spec.rb +141 -17
  115. data/spec/controllers/authorizations_controller_spec.rb +304 -27
  116. data/spec/controllers/protected_resources_controller_spec.rb +44 -35
  117. data/spec/controllers/token_info_controller_spec.rb +17 -21
  118. data/spec/controllers/tokens_controller_spec.rb +201 -17
  119. data/spec/dummy/app/assets/config/manifest.js +2 -0
  120. data/spec/dummy/config/environments/test.rb +4 -5
  121. data/spec/dummy/config/initializers/doorkeeper.rb +23 -2
  122. data/spec/dummy/config/initializers/{active_record_belongs_to_required_by_default.rb → new_framework_defaults.rb} +5 -1
  123. data/spec/dummy/config/initializers/secret_token.rb +0 -1
  124. data/spec/dummy/config/routes.rb +3 -42
  125. data/spec/dummy/db/migrate/20111122132257_create_users.rb +3 -1
  126. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +3 -1
  127. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +3 -1
  128. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +3 -1
  129. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +3 -1
  130. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +6 -0
  131. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +13 -0
  132. data/spec/dummy/db/schema.rb +38 -37
  133. data/spec/factories.rb +1 -1
  134. data/spec/generators/application_owner_generator_spec.rb +25 -6
  135. data/spec/generators/confidential_applications_generator_spec.rb +45 -0
  136. data/spec/generators/install_generator_spec.rb +1 -1
  137. data/spec/generators/migration_generator_spec.rb +25 -4
  138. data/spec/generators/pkce_generator_spec.rb +43 -0
  139. data/spec/generators/previous_refresh_token_generator_spec.rb +57 -0
  140. data/spec/generators/views_generator_spec.rb +1 -1
  141. data/spec/grape/grape_integration_spec.rb +135 -0
  142. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +2 -2
  143. data/spec/lib/config_spec.rb +199 -22
  144. data/spec/lib/doorkeeper_spec.rb +1 -126
  145. data/spec/lib/models/expirable_spec.rb +0 -4
  146. data/spec/lib/models/revocable_spec.rb +2 -4
  147. data/spec/lib/models/scopes_spec.rb +0 -4
  148. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -4
  149. data/spec/lib/oauth/authorization_code_request_spec.rb +63 -13
  150. data/spec/lib/oauth/base_request_spec.rb +43 -10
  151. data/spec/lib/oauth/base_response_spec.rb +1 -1
  152. data/spec/lib/oauth/client/credentials_spec.rb +5 -5
  153. data/spec/lib/oauth/client_credentials/creator_spec.rb +6 -2
  154. data/spec/lib/oauth/client_credentials/issuer_spec.rb +26 -7
  155. data/spec/lib/oauth/client_credentials/validation_spec.rb +2 -3
  156. data/spec/lib/oauth/client_credentials_integration_spec.rb +2 -2
  157. data/spec/lib/oauth/client_credentials_request_spec.rb +4 -5
  158. data/spec/lib/oauth/client_spec.rb +0 -3
  159. data/spec/lib/oauth/code_request_spec.rb +5 -5
  160. data/spec/lib/oauth/error_response_spec.rb +0 -3
  161. data/spec/lib/oauth/error_spec.rb +1 -3
  162. data/spec/lib/oauth/forbidden_token_response_spec.rb +1 -4
  163. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -3
  164. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -1
  165. data/spec/lib/oauth/helpers/uri_checker_spec.rb +115 -3
  166. data/spec/lib/oauth/invalid_token_response_spec.rb +2 -5
  167. data/spec/lib/oauth/password_access_token_request_spec.rb +46 -5
  168. data/spec/lib/oauth/pre_authorization_spec.rb +40 -6
  169. data/spec/lib/oauth/refresh_token_request_spec.rb +30 -14
  170. data/spec/lib/oauth/scopes_spec.rb +28 -4
  171. data/spec/lib/oauth/token_request_spec.rb +10 -13
  172. data/spec/lib/oauth/token_response_spec.rb +0 -1
  173. data/spec/lib/oauth/token_spec.rb +37 -14
  174. data/spec/lib/orm/active_record/stale_records_cleaner_spec.rb +79 -0
  175. data/spec/lib/request/strategy_spec.rb +0 -1
  176. data/spec/lib/server_spec.rb +10 -0
  177. data/spec/models/doorkeeper/access_grant_spec.rb +45 -2
  178. data/spec/models/doorkeeper/access_token_spec.rb +132 -64
  179. data/spec/models/doorkeeper/application_spec.rb +114 -23
  180. data/spec/requests/applications/applications_request_spec.rb +139 -6
  181. data/spec/requests/applications/authorized_applications_spec.rb +1 -1
  182. data/spec/requests/endpoints/authorization_spec.rb +1 -1
  183. data/spec/requests/endpoints/token_spec.rb +15 -6
  184. data/spec/requests/flows/authorization_code_errors_spec.rb +12 -2
  185. data/spec/requests/flows/authorization_code_spec.rb +199 -2
  186. data/spec/requests/flows/client_credentials_spec.rb +73 -5
  187. data/spec/requests/flows/implicit_grant_errors_spec.rb +3 -3
  188. data/spec/requests/flows/implicit_grant_spec.rb +38 -11
  189. data/spec/requests/flows/password_spec.rb +160 -24
  190. data/spec/requests/flows/refresh_token_spec.rb +6 -6
  191. data/spec/requests/flows/revoke_token_spec.rb +26 -26
  192. data/spec/requests/flows/skip_authorization_spec.rb +16 -11
  193. data/spec/requests/protected_resources/metal_spec.rb +2 -2
  194. data/spec/requests/protected_resources/private_api_spec.rb +2 -2
  195. data/spec/routing/custom_controller_routes_spec.rb +63 -7
  196. data/spec/routing/default_routes_spec.rb +6 -2
  197. data/spec/routing/scoped_routes_spec.rb +16 -2
  198. data/spec/spec_helper.rb +54 -3
  199. data/spec/spec_helper_integration.rb +2 -64
  200. data/spec/support/dependencies/factory_bot.rb +2 -0
  201. data/spec/support/doorkeeper_rspec.rb +19 -0
  202. data/spec/support/helpers/access_token_request_helper.rb +1 -1
  203. data/spec/support/helpers/authorization_request_helper.rb +4 -4
  204. data/spec/support/helpers/model_helper.rb +9 -4
  205. data/spec/support/helpers/request_spec_helper.rb +18 -6
  206. data/spec/support/helpers/url_helper.rb +15 -10
  207. data/spec/support/http_method_shim.rb +12 -16
  208. data/spec/support/shared/controllers_shared_context.rb +2 -6
  209. data/spec/support/shared/models_shared_examples.rb +4 -4
  210. data/spec/validators/redirect_uri_validator_spec.rb +58 -7
  211. data/spec/version/version_spec.rb +15 -0
  212. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  213. metadata +75 -33
  214. data/spec/controllers/application_metal_controller.rb +0 -10
  215. data/spec/support/dependencies/factory_girl.rb +0 -2
data/doorkeeper.gemspec CHANGED
@@ -1,30 +1,30 @@
1
- $LOAD_PATH.push File.expand_path("../lib", __FILE__)
1
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
2
2
 
3
- require "doorkeeper/version"
3
+ require 'doorkeeper/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "doorkeeper"
7
- s.version = Doorkeeper::VERSION
8
- s.authors = ["Felipe Elias Philipp", "Tute Costa", "Jon Moss"]
9
- s.email = %w(me@jonathanmoss.me)
10
- s.homepage = "https://github.com/doorkeeper-gem/doorkeeper"
11
- s.summary = "OAuth 2 provider for Rails and Grape"
12
- s.description = "Doorkeeper is an OAuth 2 provider for Rails and Grape."
6
+ s.name = 'doorkeeper'
7
+ s.version = Doorkeeper.gem_version
8
+ s.authors = ['Felipe Elias Philipp', 'Tute Costa', 'Jon Moss', 'Nikita Bulai']
9
+ s.email = %w(bulaj.nikita@gmail.com)
10
+ s.homepage = 'https://github.com/doorkeeper-gem/doorkeeper'
11
+ s.summary = 'OAuth 2 provider for Rails and Grape'
12
+ s.description = 'Doorkeeper is an OAuth 2 provider for Rails and Grape.'
13
13
  s.license = 'MIT'
14
14
 
15
15
  s.files = `git ls-files`.split("\n")
16
16
  s.test_files = `git ls-files -- spec/*`.split("\n")
17
- s.require_paths = ["lib"]
17
+ s.require_paths = ['lib']
18
18
 
19
- s.add_dependency "railties", ">= 4.2"
20
- s.required_ruby_version = ">= 2.1"
19
+ s.add_dependency 'railties', '>= 4.2'
20
+ s.required_ruby_version = '>= 2.1'
21
21
 
22
- s.add_development_dependency "capybara"
23
- s.add_development_dependency "coveralls"
24
- s.add_development_dependency "database_cleaner", "~> 1.5.3"
25
- s.add_development_dependency "factory_girl", "~> 4.7.0"
26
- s.add_development_dependency "generator_spec", "~> 0.9.3"
27
- s.add_development_dependency "rake", ">= 11.3.0"
28
- s.add_development_dependency "rspec-rails"
29
- s.add_development_dependency "timecop", "~> 0.8.1"
22
+ s.add_development_dependency 'capybara', '~> 2.18'
23
+ s.add_development_dependency 'coveralls'
24
+ s.add_development_dependency 'grape'
25
+ s.add_development_dependency 'database_cleaner', '~> 1.6'
26
+ s.add_development_dependency 'factory_bot', '~> 4.8'
27
+ s.add_development_dependency 'generator_spec', '~> 0.9.3'
28
+ s.add_development_dependency 'rake', '>= 11.3.0'
29
+ s.add_development_dependency 'rspec-rails'
30
30
  end
@@ -4,8 +4,10 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "rails", "~> 4.2.0"
6
6
  gem "appraisal"
7
- gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
8
- gem "sqlite3", :platform => [:ruby, :mswin, :mingw, :x64_mingw]
9
- gem "tzinfo-data", :platforms => [:mingw, :mswin, :x64_mingw]
7
+ gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
8
+ gem "sqlite3", platform: [:ruby, :mswin, :mingw, :x64_mingw]
9
+ gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
10
+ # Older Grape requires Ruby >= 2.2.2
11
+ gem "grape", '~> 0.16', '< 0.19.2'
10
12
 
11
- gemspec :path => "../"
13
+ gemspec path: "../"
@@ -4,9 +4,9 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "rails", "~> 5.0.0"
6
6
  gem "appraisal"
7
- gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
8
- gem "sqlite3", :platform => [:ruby, :mswin, :mingw, :x64_mingw]
9
- gem "tzinfo-data", :platforms => [:mingw, :mswin, :x64_mingw]
7
+ gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
8
+ gem "sqlite3", platforms: [:ruby, :mswin, :mingw, :x64_mingw]
9
+ gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
10
10
  gem "rspec-rails", "~> 3.5"
11
11
 
12
- gemspec :path => "../"
12
+ gemspec path: "../"
@@ -2,12 +2,11 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", :github => "rails/rails"
5
+ gem "rails", "~> 5.1.0"
6
6
  gem "appraisal"
7
- gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
8
- gem "sqlite3", :platform => [:ruby, :mswin, :mingw, :x64_mingw]
9
- gem "tzinfo-data", :platforms => [:mingw, :mswin, :x64_mingw]
10
- gem "arel", :github => "rails/arel"
11
- gem "rspec-rails", "~> 3.5"
7
+ gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
8
+ gem "sqlite3", platforms: [:ruby, :mswin, :mingw, :x64_mingw]
9
+ gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
10
+ gem "rspec-rails", "~> 3.7"
12
11
 
13
- gemspec :path => "../"
12
+ gemspec path: "../"
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "5.2.0"
6
+ gem "appraisal"
7
+ gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
8
+ gem "sqlite3", platforms: [:ruby, :mswin, :mingw, :x64_mingw]
9
+ gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
10
+ gem "rspec-rails", "~> 3.7"
11
+
12
+ gemspec path: "../"
@@ -0,0 +1,17 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", git: 'https://github.com/rails/rails'
6
+ gem "arel", git: 'https://github.com/rails/arel'
7
+
8
+ gem "appraisal"
9
+ gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
10
+ gem "sqlite3", platform: [:ruby, :mswin, :mingw, :x64_mingw]
11
+ gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
12
+
13
+ %w[rspec-core rspec-expectations rspec-mocks rspec-rails rspec-support].each do |lib|
14
+ gem lib, git: "https://github.com/rspec/#{lib}.git", branch: 'master'
15
+ end
16
+
17
+ gemspec path: "../"
@@ -15,19 +15,19 @@ module Doorkeeper
15
15
  end
16
16
 
17
17
  def self.configuration
18
- @config || (fail MissingConfiguration)
18
+ @config || (raise MissingConfiguration)
19
19
  end
20
20
 
21
21
  def self.setup_orm_adapter
22
22
  @orm_adapter = "doorkeeper/orm/#{configuration.orm}".classify.constantize
23
- rescue NameError => e
24
- fail e, "ORM adapter not found (#{configuration.orm})", <<-ERROR_MSG.squish
25
- [doorkeeper] ORM adapter not found (#{configuration.orm}), or there was an error
26
- trying to load it.
27
-
28
- You probably need to add the related gem for this adapter to work with
29
- doorkeeper.
30
- ERROR_MSG
23
+ rescue NameError => error
24
+ raise error, "ORM adapter not found (#{configuration.orm})", <<-ERROR_MSG.strip_heredoc
25
+ [doorkeeper] ORM adapter not found (#{configuration.orm}), or there was an error
26
+ trying to load it.
27
+
28
+ You probably need to add the related gem for this adapter to work with
29
+ doorkeeper.
30
+ ERROR_MSG
31
31
  end
32
32
 
33
33
  def self.setup_orm_models
@@ -59,12 +59,12 @@ doorkeeper.
59
59
  # @option opts[Boolean] :confirmation (false)
60
60
  # Set confirm_application_owner variable
61
61
  def enable_application_owner(opts = {})
62
- @config.instance_variable_set('@enable_application_owner', true)
62
+ @config.instance_variable_set(:@enable_application_owner, true)
63
63
  confirm_application_owner if opts[:confirmation].present? && opts[:confirmation]
64
64
  end
65
65
 
66
66
  def confirm_application_owner
67
- @config.instance_variable_set('@confirm_application_owner', true)
67
+ @config.instance_variable_set(:@confirm_application_owner, true)
68
68
  end
69
69
 
70
70
  # Define default access token scopes for your provider
@@ -72,7 +72,7 @@ doorkeeper.
72
72
  # @param scopes [Array] Default set of access (OAuth::Scopes.new)
73
73
  # token scopes
74
74
  def default_scopes(*scopes)
75
- @config.instance_variable_set('@default_scopes', OAuth::Scopes.from_array(scopes))
75
+ @config.instance_variable_set(:@default_scopes, OAuth::Scopes.from_array(scopes))
76
76
  end
77
77
 
78
78
  # Define default access token scopes for your provider
@@ -80,7 +80,7 @@ doorkeeper.
80
80
  # @param scopes [Array] Optional set of access (OAuth::Scopes.new)
81
81
  # token scopes
82
82
  def optional_scopes(*scopes)
83
- @config.instance_variable_set('@optional_scopes', OAuth::Scopes.from_array(scopes))
83
+ @config.instance_variable_set(:@optional_scopes, OAuth::Scopes.from_array(scopes))
84
84
  end
85
85
 
86
86
  # Change the way client credentials are retrieved from the request object.
@@ -90,7 +90,7 @@ doorkeeper.
90
90
  #
91
91
  # @param methods [Array] Define client credentials
92
92
  def client_credentials(*methods)
93
- @config.instance_variable_set('@client_credentials', methods)
93
+ @config.instance_variable_set(:@client_credentials_methods, methods)
94
94
  end
95
95
 
96
96
  # Change the way access token is authenticated from the request object.
@@ -100,57 +100,41 @@ doorkeeper.
100
100
  #
101
101
  # @param methods [Array] Define access token methods
102
102
  def access_token_methods(*methods)
103
- @config.instance_variable_set('@access_token_methods', methods)
103
+ @config.instance_variable_set(:@access_token_methods, methods)
104
104
  end
105
105
 
106
- # Issue access tokens with refresh token (disabled by default)
107
- def use_refresh_token
108
- @config.instance_variable_set('@refresh_token_enabled', true)
109
- end
110
-
111
- # WWW-Authenticate Realm (default "Doorkeeper").
112
- #
113
- # @param realm [String] ("Doorkeeper") Authentication realm
114
- def realm(realm)
115
- @config.instance_variable_set('@realm', realm)
106
+ # Issue access tokens with refresh token (disabled if not set)
107
+ def use_refresh_token(enabled = true, &block)
108
+ @config.instance_variable_set(
109
+ :@refresh_token_enabled,
110
+ block ? block : enabled
111
+ )
116
112
  end
117
113
 
118
114
  # Reuse access token for the same resource owner within an application
119
115
  # (disabled by default)
120
116
  # Rationale: https://github.com/doorkeeper-gem/doorkeeper/issues/383
121
117
  def reuse_access_token
122
- @config.instance_variable_set("@reuse_access_token", true)
118
+ @config.instance_variable_set(:@reuse_access_token, true)
123
119
  end
124
120
 
125
- # Forces the usage of the HTTPS protocol in non-native redirect uris
126
- # (enabled by default in non-development environments). OAuth2
127
- # delegates security in communication to the HTTPS protocol so it is
128
- # wise to keep this enabled.
129
- #
130
- # @param [Boolean] boolean value for the parameter, true by default in
131
- # non-development environment
132
- def force_ssl_in_redirect_uri(boolean)
133
- @config.instance_variable_set("@force_ssl_in_redirect_uri", boolean)
121
+ # Use an API mode for applications generated with --api argument
122
+ # It will skip applications controller, disable forgery protection
123
+ def api_only
124
+ @config.instance_variable_set(:@api_only, true)
134
125
  end
135
126
 
136
- # Use a custom class for generating the access token.
137
- # https://github.com/doorkeeper-gem/doorkeeper#custom-access-token-generator
138
- #
139
- # @param access_token_generator [String]
140
- # the name of the access token generator class
141
- def access_token_generator(access_token_generator)
142
- @config.instance_variable_set(
143
- '@access_token_generator', access_token_generator
144
- )
127
+ # Forbids creating/updating applications with arbitrary scopes that are
128
+ # not in configuration, i.e. `default_scopes` or `optional_scopes`.
129
+ # (disabled by default)
130
+ def enforce_configured_scopes
131
+ @config.instance_variable_set(:@enforce_configured_scopes, true)
145
132
  end
146
133
 
147
- # The controller Doorkeeper::ApplicationController inherits from.
148
- # Defaults to ActionController::Base.
149
- # https://github.com/doorkeeper-gem/doorkeeper#custom-base-controller
150
- #
151
- # @param base_controller [String] the name of the base controller
152
- def base_controller(base_controller)
153
- @config.instance_variable_set('@base_controller', base_controller)
134
+ # Enforce request content type as the spec requires:
135
+ # disabled by default for backward compatibility.
136
+ def enforce_content_type
137
+ @config.instance_variable_set(:@enforce_content_type, true)
154
138
  end
155
139
  end
156
140
 
@@ -210,10 +194,6 @@ doorkeeper.
210
194
 
211
195
  public attribute
212
196
  end
213
-
214
- def extended(base)
215
- base.send(:private, :option)
216
- end
217
197
  end
218
198
 
219
199
  extend Option
@@ -221,48 +201,120 @@ doorkeeper.
221
201
  option :resource_owner_authenticator,
222
202
  as: :authenticate_resource_owner,
223
203
  default: (lambda do |_routes|
224
- logger.warn(I18n.translate('doorkeeper.errors.messages.resource_owner_authenticator_not_configured'))
204
+ ::Rails.logger.warn(
205
+ I18n.t('doorkeeper.errors.messages.resource_owner_authenticator_not_configured')
206
+ )
207
+
225
208
  nil
226
209
  end)
210
+
227
211
  option :admin_authenticator,
228
212
  as: :authenticate_admin,
229
- default: ->(_routes) {}
213
+ default: (lambda do |_routes|
214
+ ::Rails.logger.warn(
215
+ I18n.t('doorkeeper.errors.messages.admin_authenticator_not_configured')
216
+ )
217
+
218
+ head :forbidden
219
+ end)
220
+
230
221
  option :resource_owner_from_credentials,
231
222
  default: (lambda do |_routes|
232
- warn(I18n.translate('doorkeeper.errors.messages.credential_flow_not_configured'))
223
+ ::Rails.logger.warn(
224
+ I18n.t('doorkeeper.errors.messages.credential_flow_not_configured')
225
+ )
226
+
233
227
  nil
234
228
  end)
235
-
229
+ option :before_successful_authorization, default: ->(_context) {}
230
+ option :after_successful_authorization, default: ->(_context) {}
231
+ option :before_successful_strategy_response, default: ->(_request) {}
232
+ option :after_successful_strategy_response,
233
+ default: ->(_request, _response) {}
236
234
  option :skip_authorization, default: ->(_routes) {}
237
235
  option :access_token_expires_in, default: 7200
238
- option :custom_access_token_expires_in, default: ->(_app) { nil }
236
+ option :custom_access_token_expires_in, default: ->(_context) { nil }
239
237
  option :authorization_code_expires_in, default: 600
240
238
  option :orm, default: :active_record
241
239
  option :native_redirect_uri, default: 'urn:ietf:wg:oauth:2.0:oob'
242
240
  option :active_record_options, default: {}
241
+ option :grant_flows, default: %w[authorization_code client_credentials]
242
+
243
+ # Allows to forbid specific Application redirect URI's by custom rules.
244
+ # Doesn't forbid any URI by default.
245
+ #
246
+ # @param forbid_redirect_uri [Proc] Block or any object respond to #call
247
+ #
248
+ option :forbid_redirect_uri, default: ->(_uri) { false }
249
+
250
+ # WWW-Authenticate Realm (default "Doorkeeper").
251
+ #
252
+ # @param realm [String] ("Doorkeeper") Authentication realm
253
+ #
243
254
  option :realm, default: 'Doorkeeper'
255
+
256
+ # Forces the usage of the HTTPS protocol in non-native redirect uris
257
+ # (enabled by default in non-development environments). OAuth2
258
+ # delegates security in communication to the HTTPS protocol so it is
259
+ # wise to keep this enabled.
260
+ #
261
+ # @param [Boolean] boolean_or_block value for the parameter, true by default in
262
+ # non-development environment
263
+ #
264
+ # @yield [uri] Conditional usage of SSL redirect uris.
265
+ # @yieldparam [URI] Redirect URI
266
+ # @yieldreturn [Boolean] Indicates necessity of usage of the HTTPS protocol
267
+ # in non-native redirect uris
268
+ #
244
269
  option :force_ssl_in_redirect_uri, default: !Rails.env.development?
245
- option :grant_flows, default: %w(authorization_code client_credentials)
270
+
271
+ # Use a custom class for generating the access token.
272
+ # https://github.com/doorkeeper-gem/doorkeeper#custom-access-token-generator
273
+ #
274
+ # @param access_token_generator [String]
275
+ # the name of the access token generator class
276
+ #
246
277
  option :access_token_generator,
247
278
  default: 'Doorkeeper::OAuth::Helpers::UniqueToken'
279
+
280
+ # The controller Doorkeeper::ApplicationController inherits from.
281
+ # Defaults to ActionController::Base.
282
+ # https://github.com/doorkeeper-gem/doorkeeper#custom-base-controller
283
+ #
284
+ # @param base_controller [String] the name of the base controller
248
285
  option :base_controller,
249
286
  default: 'ActionController::Base'
250
287
 
251
288
  attr_reader :reuse_access_token
289
+ attr_reader :api_only
290
+ attr_reader :enforce_content_type
291
+
292
+ def api_only
293
+ @api_only ||= false
294
+ end
295
+
296
+ def enforce_content_type
297
+ @enforce_content_type ||= false
298
+ end
252
299
 
253
300
  def refresh_token_enabled?
254
- @refresh_token_enabled ||= false
255
- !!@refresh_token_enabled
301
+ if defined?(@refresh_token_enabled)
302
+ @refresh_token_enabled
303
+ else
304
+ false
305
+ end
306
+ end
307
+
308
+ def enforce_configured_scopes?
309
+ !!(defined?(@enforce_configured_scopes) && @enforce_configured_scopes)
256
310
  end
257
311
 
258
312
  def enable_application_owner?
259
- @enable_application_owner ||= false
260
- !!@enable_application_owner
313
+ !!(defined?(@enable_application_owner) && @enable_application_owner)
261
314
  end
262
315
 
263
316
  def confirm_application_owner?
264
- @confirm_application_owner ||= false
265
- !!@confirm_application_owner
317
+ !!(defined?(@confirm_application_owner) && @confirm_application_owner)
266
318
  end
267
319
 
268
320
  def default_scopes
@@ -278,19 +330,19 @@ doorkeeper.
278
330
  end
279
331
 
280
332
  def client_credentials_methods
281
- @client_credentials ||= [:from_basic, :from_params]
333
+ @client_credentials_methods ||= %i[from_basic from_params]
282
334
  end
283
335
 
284
336
  def access_token_methods
285
- @access_token_methods ||= [:from_bearer_authorization, :from_access_token_param, :from_bearer_param]
337
+ @access_token_methods ||= %i[from_bearer_authorization from_access_token_param from_bearer_param]
286
338
  end
287
339
 
288
340
  def authorization_response_types
289
- @authorization_response_types ||= calculate_authorization_response_types
341
+ @authorization_response_types ||= calculate_authorization_response_types.freeze
290
342
  end
291
343
 
292
344
  def token_grant_types
293
- @token_grant_types ||= calculate_token_grant_types
345
+ @token_grant_types ||= calculate_token_grant_types.freeze
294
346
  end
295
347
 
296
348
  private
@@ -1,7 +1,7 @@
1
1
  module Doorkeeper
2
2
  class Engine < Rails::Engine
3
3
  initializer "doorkeeper.params.filter" do |app|
4
- parameters = %w(client_secret code authentication_token access_token refresh_token)
4
+ parameters = %w[client_secret code authentication_token access_token refresh_token]
5
5
  app.config.filter_parameters << /^(#{Regexp.union parameters})$/
6
6
  end
7
7
 
@@ -17,10 +17,14 @@ module Doorkeeper
17
17
 
18
18
  if defined?(Sprockets) && Sprockets::VERSION.chr.to_i >= 4
19
19
  initializer 'doorkeeper.assets.precompile' do |app|
20
- app.config.assets.precompile += %w(
20
+ # Force users to use:
21
+ # //= link doorkeeper/admin/application.css
22
+ # in Doorkeeper 5 for Sprockets 4 instead of precompile.
23
+ # Add note to official docs & Wiki
24
+ app.config.assets.precompile += %w[
21
25
  doorkeeper/application.css
22
26
  doorkeeper/admin/application.css
23
- )
27
+ ]
24
28
  end
25
29
  end
26
30
  end
@@ -1,27 +1,42 @@
1
1
  module Doorkeeper
2
2
  module Errors
3
3
  class DoorkeeperError < StandardError
4
+ def type
5
+ message
6
+ end
4
7
  end
5
8
 
6
9
  class InvalidAuthorizationStrategy < DoorkeeperError
10
+ def type
11
+ :unsupported_response_type
12
+ end
7
13
  end
8
14
 
9
15
  class InvalidTokenReuse < DoorkeeperError
16
+ def type
17
+ :invalid_request
18
+ end
10
19
  end
11
20
 
12
21
  class InvalidGrantReuse < DoorkeeperError
22
+ def type
23
+ :invalid_grant
24
+ end
13
25
  end
14
26
 
15
27
  class InvalidTokenStrategy < DoorkeeperError
28
+ def type
29
+ :unsupported_grant_type
30
+ end
16
31
  end
17
32
 
18
33
  class MissingRequestStrategy < DoorkeeperError
34
+ def type
35
+ :invalid_request
36
+ end
19
37
  end
20
38
 
21
- class UnableToGenerateToken < DoorkeeperError
22
- end
23
-
24
- class TokenGeneratorNotFound < DoorkeeperError
25
- end
39
+ UnableToGenerateToken = Class.new(DoorkeeperError)
40
+ TokenGeneratorNotFound = Class.new(DoorkeeperError)
26
41
  end
27
42
  end
@@ -9,7 +9,7 @@ module Doorkeeper
9
9
 
10
10
  # endpoint specific scopes > parameter scopes > default scopes
11
11
  def doorkeeper_authorize!(*scopes)
12
- endpoint_scopes = env["api.endpoint"].route_setting(:scopes)
12
+ endpoint_scopes = endpoint.route_setting(:scopes) || endpoint.options[:route_options][:scopes]
13
13
  scopes = if endpoint_scopes
14
14
  Doorkeeper::OAuth::Scopes.from_array(endpoint_scopes)
15
15
  elsif scopes && !scopes.empty?
@@ -20,20 +20,18 @@ module Doorkeeper
20
20
  end
21
21
 
22
22
  def doorkeeper_render_error_with(error)
23
- status_code = case error.status
24
- when :unauthorized
25
- 401
26
- when :forbidden
27
- 403
28
- end
29
-
23
+ status_code = error_status_codes[error.status]
30
24
  error!({ error: error.description }, status_code, error.headers)
31
25
  end
32
26
 
33
27
  private
34
28
 
29
+ def endpoint
30
+ env['api.endpoint']
31
+ end
32
+
35
33
  def doorkeeper_token
36
- @_doorkeeper_token ||= OAuth::Token.authenticate(
34
+ @doorkeeper_token ||= OAuth::Token.authenticate(
37
35
  decorated_request,
38
36
  *Doorkeeper.configuration.access_token_methods
39
37
  )
@@ -42,6 +40,13 @@ module Doorkeeper
42
40
  def decorated_request
43
41
  AuthorizationDecorator.new(request)
44
42
  end
43
+
44
+ def error_status_codes
45
+ {
46
+ unauthorized: 401,
47
+ forbidden: 403
48
+ }
49
+ end
45
50
  end
46
51
  end
47
52
  end
@@ -5,11 +5,13 @@ module Doorkeeper
5
5
  module Controller
6
6
  private
7
7
 
8
- def authenticate_resource_owner! # :doc:
8
+ # :doc:
9
+ def authenticate_resource_owner!
9
10
  current_resource_owner
10
11
  end
11
12
 
12
- def current_resource_owner # :doc:
13
+ # :doc:
14
+ def current_resource_owner
13
15
  instance_eval(&Doorkeeper.configuration.authenticate_resource_owner)
14
16
  end
15
17
 
@@ -17,7 +19,8 @@ module Doorkeeper
17
19
  instance_eval(&Doorkeeper.configuration.resource_owner_from_credentials)
18
20
  end
19
21
 
20
- def authenticate_admin! # :doc:
22
+ # :doc:
23
+ def authenticate_admin!
21
24
  instance_eval(&Doorkeeper.configuration.authenticate_admin)
22
25
  end
23
26
 
@@ -25,31 +28,17 @@ module Doorkeeper
25
28
  @server ||= Server.new(self)
26
29
  end
27
30
 
28
- def doorkeeper_token # :doc:
29
- @token ||= OAuth::Token.authenticate request, *config_methods
31
+ # :doc:
32
+ def doorkeeper_token
33
+ @doorkeeper_token ||= OAuth::Token.authenticate request, *config_methods
30
34
  end
31
35
 
32
36
  def config_methods
33
- @methods ||= Doorkeeper.configuration.access_token_methods
37
+ @config_methods ||= Doorkeeper.configuration.access_token_methods
34
38
  end
35
39
 
36
40
  def get_error_response_from_exception(exception)
37
- error_name = case exception
38
- when Errors::InvalidTokenStrategy
39
- :unsupported_grant_type
40
- when Errors::InvalidAuthorizationStrategy
41
- :unsupported_response_type
42
- when Errors::MissingRequestStrategy
43
- :invalid_request
44
- when Errors::InvalidTokenReuse
45
- :invalid_request
46
- when Errors::InvalidGrantReuse
47
- :invalid_grant
48
- when Errors::DoorkeeperError
49
- exception.message
50
- end
51
-
52
- OAuth::ErrorResponse.new name: error_name, state: params[:state]
41
+ OAuth::ErrorResponse.new name: exception.type, state: params[:state]
53
42
  end
54
43
 
55
44
  def handle_token_exception(exception)
@@ -62,6 +51,11 @@ module Doorkeeper
62
51
  def skip_authorization?
63
52
  !!instance_exec([@server.current_resource_owner, @pre_auth.client], &Doorkeeper.configuration.skip_authorization)
64
53
  end
54
+
55
+ def enforce_content_type
56
+ return if request.content_type == 'application/x-www-form-urlencoded'
57
+ render json: {}, status: :unsupported_media_type
58
+ end
65
59
  end
66
60
  end
67
61
  end