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,17 +1,8 @@
1
- module Doorkeeper
2
- class ApplicationMetalController < ActionController::Metal
3
- MODULES = [
4
- ActionController::Instrumentation,
5
- AbstractController::Rendering,
6
- ActionController::Rendering,
7
- ActionController::Renderers::All,
8
- AbstractController::Callbacks,
9
- Helpers::Controller
10
- ].freeze
1
+ # frozen_string_literal: true
11
2
 
12
- MODULES.each do |mod|
13
- include mod
14
- end
3
+ module Doorkeeper
4
+ class ApplicationMetalController < ActionController::API
5
+ include Helpers::Controller
15
6
 
16
7
  before_action :enforce_content_type,
17
8
  if: -> { Doorkeeper.configuration.enforce_content_type }
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  class ApplicationsController < Doorkeeper::ApplicationController
3
- layout 'doorkeeper/admin' unless Doorkeeper.configuration.api_only
5
+ layout "doorkeeper/admin" unless Doorkeeper.configuration.api_only
4
6
 
5
7
  before_action :authenticate_admin!
6
8
  before_action :set_application, only: %i[show edit update destroy]
@@ -38,7 +40,11 @@ module Doorkeeper
38
40
  else
39
41
  respond_to do |format|
40
42
  format.html { render :new }
41
- format.json { render json: { errors: @application.errors.full_messages }, status: :unprocessable_entity }
43
+ format.json do
44
+ errors = @application.errors.full_messages
45
+
46
+ render json: { errors: errors }, status: :unprocessable_entity
47
+ end
42
48
  end
43
49
  end
44
50
  end
@@ -47,7 +53,7 @@ module Doorkeeper
47
53
 
48
54
  def update
49
55
  if @application.update(application_params)
50
- flash[:notice] = I18n.t(:notice, scope: %i[doorkeeper flash applications update])
56
+ flash[:notice] = I18n.t(:notice, scope: i18n_scope(:update))
51
57
 
52
58
  respond_to do |format|
53
59
  format.html { redirect_to oauth_application_url(@application) }
@@ -56,13 +62,17 @@ module Doorkeeper
56
62
  else
57
63
  respond_to do |format|
58
64
  format.html { render :edit }
59
- format.json { render json: { errors: @application.errors.full_messages }, status: :unprocessable_entity }
65
+ format.json do
66
+ errors = @application.errors.full_messages
67
+
68
+ render json: { errors: errors }, status: :unprocessable_entity
69
+ end
60
70
  end
61
71
  end
62
72
  end
63
73
 
64
74
  def destroy
65
- flash[:notice] = I18n.t(:notice, scope: %i[doorkeeper flash applications destroy]) if @application.destroy
75
+ flash[:notice] = I18n.t(:notice, scope: i18n_scope(:destroy)) if @application.destroy
66
76
 
67
77
  respond_to do |format|
68
78
  format.html { redirect_to oauth_applications_url }
@@ -77,8 +87,12 @@ module Doorkeeper
77
87
  end
78
88
 
79
89
  def application_params
80
- params.require(:doorkeeper_application).
81
- permit(:name, :redirect_uri, :scopes, :confidential)
90
+ params.require(:doorkeeper_application)
91
+ .permit(:name, :redirect_uri, :scopes, :confidential)
92
+ end
93
+
94
+ def i18n_scope(action)
95
+ %i[doorkeeper flash applications] << action
82
96
  end
83
97
  end
84
98
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  class AuthorizationsController < Doorkeeper::ApplicationController
3
5
  before_action :authenticate_resource_owner!
@@ -41,13 +43,11 @@ module Doorkeeper
41
43
  end
42
44
 
43
45
  def matching_token?
44
- token = AccessToken.matching_token_for(
46
+ AccessToken.matching_token_for(
45
47
  pre_auth.client,
46
48
  current_resource_owner.id,
47
49
  pre_auth.scopes
48
50
  )
49
-
50
- token && token.accessible?
51
51
  end
52
52
 
53
53
  def redirect_or_render(auth)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  class AuthorizedApplicationsController < Doorkeeper::ApplicationController
3
5
  before_action :authenticate_resource_owner!
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  class TokenInfoController < Doorkeeper::ApplicationMetalController
3
5
  def show
4
- if doorkeeper_token && doorkeeper_token.accessible?
6
+ if doorkeeper_token&.accessible?
5
7
  render json: doorkeeper_token, status: :ok
6
8
  else
7
- error = OAuth::ErrorResponse.new(name: :invalid_request)
9
+ error = OAuth::InvalidTokenResponse.new
8
10
  response.headers.merge!(error.headers)
9
11
  render json: error.body, status: error.status
10
12
  end
@@ -1,12 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  class TokensController < Doorkeeper::ApplicationMetalController
3
5
  def create
4
- response = authorize_response
5
- headers.merge! response.headers
6
- self.response_body = response.body.to_json
7
- self.status = response.status
8
- rescue Errors::DoorkeeperError => e
9
- handle_token_exception e
6
+ headers.merge!(authorize_response.headers)
7
+ render json: authorize_response.body,
8
+ status: authorize_response.status
9
+ rescue Errors::DoorkeeperError => error
10
+ handle_token_exception(error)
10
11
  end
11
12
 
12
13
  # OAuth 2.0 Token Revocation - http://tools.ietf.org/html/rfc7009
@@ -31,8 +32,8 @@ module Doorkeeper
31
32
  if introspection.authorized?
32
33
  render json: introspection.to_json, status: 200
33
34
  else
34
- error = OAuth::ErrorResponse.new(name: introspection.error)
35
- response.headers.merge!(error.headers)
35
+ error = introspection.error_response
36
+ headers.merge!(error.headers)
36
37
  render json: error.body, status: error.status
37
38
  end
38
39
  end
@@ -57,6 +58,7 @@ module Doorkeeper
57
58
  # https://tools.ietf.org/html/rfc7009
58
59
  def authorized?
59
60
  return unless token.present?
61
+
60
62
  # Client is confidential, therefore client authentication & authorization
61
63
  # is required
62
64
  if token.application_id? && token.application.confidential?
@@ -73,12 +75,12 @@ module Doorkeeper
73
75
  end
74
76
 
75
77
  def token
76
- @token ||= AccessToken.by_token(request.POST['token']) ||
77
- AccessToken.by_refresh_token(request.POST['token'])
78
+ @token ||= AccessToken.by_token(params["token"]) ||
79
+ AccessToken.by_refresh_token(params["token"])
78
80
  end
79
81
 
80
82
  def strategy
81
- @strategy ||= server.token_request params[:grant_type]
83
+ @strategy ||= server.token_request(params[:grant_type])
82
84
  end
83
85
 
84
86
  def authorize_response
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  module DashboardHelper
3
5
  def doorkeeper_errors_for(object, method)
4
6
  return if object.errors[method].blank?
5
7
 
6
8
  output = object.errors[method].map do |msg|
7
- content_tag(:span, class: 'form-text') do
9
+ content_tag(:span, class: "form-text") do
8
10
  msg.capitalize
9
11
  end
10
12
  end
@@ -1,4 +1,6 @@
1
- require 'uri'
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
2
4
 
3
5
  class RedirectUriValidator < ActiveModel::EachValidator
4
6
  def self.native_redirect_uri
@@ -7,11 +9,14 @@ class RedirectUriValidator < ActiveModel::EachValidator
7
9
 
8
10
  def validate_each(record, attribute, value)
9
11
  if value.blank?
12
+ return if Doorkeeper.configuration.allow_blank_redirect_uri?(record)
13
+
10
14
  record.errors.add(attribute, :blank)
11
15
  else
12
16
  value.split.each do |val|
13
17
  uri = ::URI.parse(val)
14
18
  next if native_redirect_uri?(uri)
19
+
15
20
  record.errors.add(attribute, :forbidden_uri) if forbidden_uri?(uri)
16
21
  record.errors.add(attribute, :fragment_present) unless uri.fragment.nil?
17
22
  record.errors.add(attribute, :relative_uri) if uri.scheme.nil? || uri.host.nil?
@@ -34,7 +39,7 @@ class RedirectUriValidator < ActiveModel::EachValidator
34
39
 
35
40
  def invalid_ssl_uri?(uri)
36
41
  forces_ssl = Doorkeeper.configuration.force_ssl_in_redirect_uri
37
- non_https = uri.try(:scheme) == 'http'
42
+ non_https = uri.try(:scheme) == "http"
38
43
 
39
44
  if forces_ssl.respond_to?(:call)
40
45
  forces_ssl.call(uri) && non_https
@@ -25,6 +25,12 @@
25
25
  <%= raw t('doorkeeper.applications.help.native_redirect_uri', native_redirect_uri: content_tag(:code, class: 'bg-light') { Doorkeeper.configuration.native_redirect_uri }) %>
26
26
  </span>
27
27
  <% end %>
28
+
29
+ <% if Doorkeeper.configuration.allow_blank_redirect_uri?(application) %>
30
+ <span class="form-text text-secondary">
31
+ <%= t('doorkeeper.applications.help.blank_redirect_uri') %>
32
+ </span>
33
+ <% end %>
28
34
  </div>
29
35
  </div>
30
36
 
@@ -8,7 +8,7 @@
8
8
  <p><code class="bg-light" id="application_id"><%= @application.uid %></code></p>
9
9
 
10
10
  <h4><%= t('.secret') %>:</h4>
11
- <p><code class="bg-light" id="secret"><%= @application.secret %></code></p>
11
+ <p><code class="bg-light" id="secret"><%= @application.plaintext_secret %></code></p>
12
12
 
13
13
  <h4><%= t('.scopes') %>:</h4>
14
14
  <p><code class="bg-light" id="scopes"><%= @application.scopes.presence || raw('&nbsp;') %></code></p>
@@ -17,9 +17,11 @@
17
17
  <li class="nav-item <%= 'active' if request.path == oauth_applications_path %>">
18
18
  <%= link_to t('doorkeeper.layouts.admin.nav.applications'), oauth_applications_path, class: 'nav-link' %>
19
19
  </li>
20
- <li class="nav-item">
21
- <%= link_to t('doorkeeper.layouts.admin.nav.home'), root_path, class: 'nav-link' %>
22
- </li>
20
+ <% if respond_to?(:root_path) %>
21
+ <li class="nav-item">
22
+ <%= link_to t('doorkeeper.layouts.admin.nav.home'), root_path, class: 'nav-link' %>
23
+ </li>
24
+ <% end %>
23
25
  </ul>
24
26
  </div>
25
27
  </nav>
data/bin/console ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "rails/all"
6
+ require "doorkeeper"
7
+
8
+ # You can add fixtures and/or initialization code here to make experimenting
9
+ # with your gem easier. You can also use a different console, if you like.
10
+
11
+ # (If you use this, don't forget to add pry to your Gemfile!)
12
+ # require "pry"
13
+ # Pry.start
14
+
15
+ require "irb"
16
+ IRB.start(__FILE__)
@@ -32,6 +32,7 @@ en:
32
32
  help:
33
33
  confidential: 'Application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential.'
34
34
  redirect_uri: 'Use one line per URI'
35
+ blank_redirect_uri: "Leave it blank if you configured your provider to use Client Credentials, Resource Owner Password Credentials or any other grant type that doesn't require redirect URI."
35
36
  native_redirect_uri: 'Use %{native_redirect_uri} if you want to add localhost URIs for development purposes'
36
37
  scopes: 'Separate scopes with spaces. Leave blank to use the default scopes.'
37
38
  edit:
data/doorkeeper.gemspec CHANGED
@@ -1,30 +1,34 @@
1
- $LOAD_PATH.push File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
2
 
3
- require 'doorkeeper/version'
3
+ $LOAD_PATH.push File.expand_path("lib", __dir__)
4
4
 
5
- Gem::Specification.new do |s|
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
- s.license = 'MIT'
5
+ require "doorkeeper/version"
14
6
 
15
- s.files = `git ls-files`.split("\n")
16
- s.test_files = `git ls-files -- spec/*`.split("\n")
17
- s.require_paths = ['lib']
7
+ Gem::Specification.new do |gem|
8
+ gem.name = "doorkeeper"
9
+ gem.version = Doorkeeper.gem_version
10
+ gem.authors = ["Felipe Elias Philipp", "Tute Costa", "Jon Moss", "Nikita Bulai"]
11
+ gem.email = %w[bulaj.nikita@gmail.com]
12
+ gem.homepage = "https://github.com/doorkeeper-gem/doorkeeper"
13
+ gem.summary = "OAuth 2 provider for Rails and Grape"
14
+ gem.description = "Doorkeeper is an OAuth 2 provider for Rails and Grape."
15
+ gem.license = "MIT"
18
16
 
19
- s.add_dependency 'railties', '>= 4.2'
20
- s.required_ruby_version = '>= 2.1'
17
+ gem.files = `git ls-files`.split("\n")
18
+ gem.test_files = `git ls-files -- spec/*`.split("\n")
19
+ gem.require_paths = ["lib"]
21
20
 
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'
21
+ gem.add_dependency "railties", ">= 5"
22
+ gem.required_ruby_version = ">= 2.4"
23
+
24
+ gem.add_development_dependency "appraisal"
25
+ gem.add_development_dependency "capybara"
26
+ gem.add_development_dependency "coveralls"
27
+ gem.add_development_dependency "danger", "~> 6.0"
28
+ gem.add_development_dependency "database_cleaner", "~> 1.6"
29
+ gem.add_development_dependency "factory_bot", "~> 5.0"
30
+ gem.add_development_dependency "generator_spec", "~> 0.9.3"
31
+ gem.add_development_dependency "grape"
32
+ gem.add_development_dependency "rake", ">= 11.3.0"
33
+ gem.add_development_dependency "rspec-rails"
30
34
  end
@@ -3,10 +3,15 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "rails", "~> 5.0.0"
6
- gem "appraisal"
7
- gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
8
- gem "sqlite3", platforms: [:ruby, :mswin, :mingw, :x64_mingw]
6
+ gem "rspec-core", git: "https://github.com/rspec/rspec-core.git"
7
+ gem "rspec-expectations", git: "https://github.com/rspec/rspec-expectations.git"
8
+ gem "rspec-mocks", git: "https://github.com/rspec/rspec-mocks.git"
9
+ gem "rspec-rails", branch: "4-0-dev", git: "https://github.com/rspec/rspec-rails.git"
10
+ gem "rspec-support", git: "https://github.com/rspec/rspec-support.git"
11
+ gem "rubocop", "~> 0.66"
12
+ gem "bcrypt", "~> 3.1", require: false
13
+ gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
14
+ gem "sqlite3", "~> 1.3", "< 1.4", platform: [:ruby, :mswin, :mingw, :x64_mingw]
9
15
  gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
10
- gem "rspec-rails", "~> 3.5"
11
16
 
12
17
  gemspec path: "../"
@@ -3,10 +3,15 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "rails", "~> 5.1.0"
6
- gem "appraisal"
7
- gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
8
- gem "sqlite3", platforms: [:ruby, :mswin, :mingw, :x64_mingw]
6
+ gem "rspec-core", git: "https://github.com/rspec/rspec-core.git"
7
+ gem "rspec-expectations", git: "https://github.com/rspec/rspec-expectations.git"
8
+ gem "rspec-mocks", git: "https://github.com/rspec/rspec-mocks.git"
9
+ gem "rspec-rails", branch: "4-0-dev", git: "https://github.com/rspec/rspec-rails.git"
10
+ gem "rspec-support", git: "https://github.com/rspec/rspec-support.git"
11
+ gem "rubocop", "~> 0.66"
12
+ gem "bcrypt", "~> 3.1", require: false
13
+ gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
14
+ gem "sqlite3", "~> 1.3", "< 1.4", platform: [:ruby, :mswin, :mingw, :x64_mingw]
9
15
  gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
10
- gem "rspec-rails", "~> 3.7"
11
16
 
12
17
  gemspec path: "../"
@@ -2,11 +2,16 @@
2
2
 
3
3
  source "https://rubygems.org"
4
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]
5
+ gem "rails", "~> 5.2.0"
6
+ gem "rspec-core", git: "https://github.com/rspec/rspec-core.git"
7
+ gem "rspec-expectations", git: "https://github.com/rspec/rspec-expectations.git"
8
+ gem "rspec-mocks", git: "https://github.com/rspec/rspec-mocks.git"
9
+ gem "rspec-rails", branch: "4-0-dev", git: "https://github.com/rspec/rspec-rails.git"
10
+ gem "rspec-support", git: "https://github.com/rspec/rspec-support.git"
11
+ gem "rubocop", "~> 0.66"
12
+ gem "bcrypt", "~> 3.1", require: false
13
+ gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
14
+ gem "sqlite3", "~> 1.3", "< 1.4", platform: [:ruby, :mswin, :mingw, :x64_mingw]
9
15
  gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
10
- gem "rspec-rails", "~> 3.7"
11
16
 
12
17
  gemspec path: "../"
@@ -0,0 +1,17 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 6.0.0.beta3"
6
+ gem "rspec-core", git: "https://github.com/rspec/rspec-core.git"
7
+ gem "rspec-expectations", git: "https://github.com/rspec/rspec-expectations.git"
8
+ gem "rspec-mocks", git: "https://github.com/rspec/rspec-mocks.git"
9
+ gem "rspec-rails", branch: "4-0-dev", git: "https://github.com/rspec/rspec-rails.git"
10
+ gem "rspec-support", git: "https://github.com/rspec/rspec-support.git"
11
+ gem "rubocop", "~> 0.66"
12
+ gem "bcrypt", "~> 3.1", require: false
13
+ gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
14
+ gem "sqlite3", "~> 1.4", platform: [:ruby, :mswin, :mingw, :x64_mingw]
15
+ gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
16
+
17
+ gemspec path: "../"
@@ -2,16 +2,16 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", git: 'https://github.com/rails/rails'
6
- gem "arel", git: 'https://github.com/rails/arel'
7
-
8
- gem "appraisal"
5
+ gem "rails", git: "https://github.com/rails/rails"
6
+ gem "rspec-core", git: "https://github.com/rspec/rspec-core.git"
7
+ gem "rspec-expectations", git: "https://github.com/rspec/rspec-expectations.git"
8
+ gem "rspec-mocks", git: "https://github.com/rspec/rspec-mocks.git"
9
+ gem "rspec-rails", branch: "4-0-dev", git: "https://github.com/rspec/rspec-rails.git"
10
+ gem "rspec-support", git: "https://github.com/rspec/rspec-support.git"
11
+ gem "rubocop", "~> 0.66"
12
+ gem "bcrypt", "~> 3.1", require: false
9
13
  gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
10
- gem "sqlite3", platform: [:ruby, :mswin, :mingw, :x64_mingw]
14
+ gem "sqlite3", "~> 1.4", platform: [:ruby, :mswin, :mingw, :x64_mingw]
11
15
  gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
12
16
 
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
17
  gemspec path: "../"
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doorkeeper
4
+ class Config
5
+ # Doorkeeper configuration option DSL
6
+ module Option
7
+ # Defines configuration option
8
+ #
9
+ # When you call option, it defines two methods. One method will take place
10
+ # in the +Config+ class and the other method will take place in the
11
+ # +Builder+ class.
12
+ #
13
+ # The +name+ parameter will set both builder method and config attribute.
14
+ # If the +:as+ option is defined, the builder method will be the specified
15
+ # option while the config attribute will be the +name+ parameter.
16
+ #
17
+ # If you want to introduce another level of config DSL you can
18
+ # define +builder_class+ parameter.
19
+ # Builder should take a block as the initializer parameter and respond to function +build+
20
+ # that returns the value of the config attribute.
21
+ #
22
+ # ==== Options
23
+ #
24
+ # * [:+as+] Set the builder method that goes inside +configure+ block
25
+ # * [+:default+] The default value in case no option was set
26
+ # * [+:builder_class+] Configuration option builder class
27
+ #
28
+ # ==== Examples
29
+ #
30
+ # option :name
31
+ # option :name, as: :set_name
32
+ # option :name, default: 'My Name'
33
+ # option :scopes builder_class: ScopesBuilder
34
+ #
35
+ def option(name, options = {})
36
+ attribute = options[:as] || name
37
+ attribute_builder = options[:builder_class]
38
+
39
+ Builder.instance_eval do
40
+ remove_method name if method_defined?(name)
41
+ define_method name do |*args, &block|
42
+ value = if attribute_builder
43
+ attribute_builder.new(&block).build
44
+ else
45
+ block || args.first
46
+ end
47
+
48
+ @config.instance_variable_set(:"@#{attribute}", value)
49
+ end
50
+ end
51
+
52
+ define_method attribute do |*_args|
53
+ if instance_variable_defined?(:"@#{attribute}")
54
+ instance_variable_get(:"@#{attribute}")
55
+ else
56
+ options[:default]
57
+ end
58
+ end
59
+
60
+ public attribute
61
+ end
62
+ end
63
+ end
64
+ end