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,12 +1,14 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
2
4
 
3
5
  module ControllerActions
4
6
  def index
5
- render plain: 'index'
7
+ render plain: "index"
6
8
  end
7
9
 
8
10
  def show
9
- render plain: 'show'
11
+ render plain: "show"
10
12
  end
11
13
 
12
14
  def doorkeeper_unauthorized_render_options(*); end
@@ -14,98 +16,98 @@ module ControllerActions
14
16
  def doorkeeper_forbidden_render_options(*); end
15
17
  end
16
18
 
17
- describe 'doorkeeper authorize filter' do
18
- context 'accepts token code specified as' do
19
+ describe "doorkeeper authorize filter" do
20
+ context "accepts token code specified as" do
19
21
  controller do
20
22
  before_action :doorkeeper_authorize!
21
23
 
22
24
  def index
23
- render plain: 'index'
25
+ render plain: "index"
24
26
  end
25
27
  end
26
28
 
27
- let(:token_string) { '1A2BC3' }
29
+ let(:token_string) { "1A2BC3" }
28
30
  let(:token) do
29
31
  double(Doorkeeper::AccessToken,
30
32
  acceptable?: true, previous_refresh_token: "",
31
33
  revoke_previous_refresh_token!: true)
32
34
  end
33
35
 
34
- it 'access_token param' do
36
+ it "access_token param" do
35
37
  expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
36
38
  get :index, params: { access_token: token_string }
37
39
  end
38
40
 
39
- it 'bearer_token param' do
41
+ it "bearer_token param" do
40
42
  expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
41
43
  get :index, params: { bearer_token: token_string }
42
44
  end
43
45
 
44
- it 'Authorization header' do
46
+ it "Authorization header" do
45
47
  expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
46
- request.env['HTTP_AUTHORIZATION'] = "Bearer #{token_string}"
48
+ request.env["HTTP_AUTHORIZATION"] = "Bearer #{token_string}"
47
49
  get :index
48
50
  end
49
51
 
50
- it 'different kind of Authorization header' do
52
+ it "different kind of Authorization header" do
51
53
  expect(Doorkeeper::AccessToken).not_to receive(:by_token)
52
- request.env['HTTP_AUTHORIZATION'] = "MAC #{token_string}"
54
+ request.env["HTTP_AUTHORIZATION"] = "MAC #{token_string}"
53
55
  get :index
54
56
  end
55
57
 
56
- it 'does not change Authorization header value' do
58
+ it "does not change Authorization header value" do
57
59
  expect(Doorkeeper::AccessToken).to receive(:by_token).exactly(2).times.and_return(token)
58
- request.env['HTTP_AUTHORIZATION'] = "Bearer #{token_string}"
60
+ request.env["HTTP_AUTHORIZATION"] = "Bearer #{token_string}"
59
61
  get :index
60
62
  controller.send(:remove_instance_variable, :@doorkeeper_token)
61
63
  get :index
62
64
  end
63
65
  end
64
66
 
65
- context 'defined for all actions' do
67
+ context "defined for all actions" do
66
68
  controller do
67
69
  before_action :doorkeeper_authorize!
68
70
 
69
71
  include ControllerActions
70
72
  end
71
73
 
72
- context 'with valid token', token: :valid do
73
- it 'allows into index action' do
74
+ context "with valid token", token: :valid do
75
+ it "allows into index action" do
74
76
  get :index, params: { access_token: token_string }
75
77
  expect(response).to be_successful
76
78
  end
77
79
 
78
- it 'allows into show action' do
79
- get :show, params: { id: '4', access_token: token_string }
80
+ it "allows into show action" do
81
+ get :show, params: { id: "4", access_token: token_string }
80
82
  expect(response).to be_successful
81
83
  end
82
84
  end
83
85
 
84
- context 'with invalid token', token: :invalid do
85
- it 'does not allow into index action' do
86
+ context "with invalid token", token: :invalid do
87
+ it "does not allow into index action" do
86
88
  get :index, params: { access_token: token_string }
87
89
  expect(response.status).to eq 401
88
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
90
+ expect(response.header["WWW-Authenticate"]).to match(/^Bearer/)
89
91
  end
90
92
 
91
- it 'does not allow into show action' do
92
- get :show, params: { id: '4', access_token: token_string }
93
+ it "does not allow into show action" do
94
+ get :show, params: { id: "4", access_token: token_string }
93
95
  expect(response.status).to eq 401
94
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
96
+ expect(response.header["WWW-Authenticate"]).to match(/^Bearer/)
95
97
  end
96
98
  end
97
99
  end
98
100
 
99
- context 'defined with scopes' do
101
+ context "defined with scopes" do
100
102
  controller do
101
103
  before_action -> { doorkeeper_authorize! :write }
102
104
 
103
105
  include ControllerActions
104
106
  end
105
107
 
106
- let(:token_string) { '1A2DUWE' }
108
+ let(:token_string) { "1A2DUWE" }
107
109
 
108
- it 'allows if the token has particular scopes' do
110
+ it "allows if the token has particular scopes" do
109
111
  token = double(Doorkeeper::AccessToken,
110
112
  accessible?: true, scopes: %w[write public],
111
113
  previous_refresh_token: "",
@@ -119,9 +121,9 @@ describe 'doorkeeper authorize filter' do
119
121
  expect(response).to be_successful
120
122
  end
121
123
 
122
- it 'does not allow if the token does not include given scope' do
124
+ it "does not allow if the token does not include given scope" do
123
125
  token = double(Doorkeeper::AccessToken,
124
- accessible?: true, scopes: ['public'], revoked?: false,
126
+ accessible?: true, scopes: ["public"], revoked?: false,
125
127
  expired?: false, previous_refresh_token: "",
126
128
  revoke_previous_refresh_token!: true)
127
129
  expect(
@@ -131,18 +133,18 @@ describe 'doorkeeper authorize filter' do
131
133
 
132
134
  get :index, params: { access_token: token_string }
133
135
  expect(response.status).to eq 403
134
- expect(response.header).to_not include('WWW-Authenticate')
136
+ expect(response.header).to_not include("WWW-Authenticate")
135
137
  end
136
138
  end
137
139
 
138
- context 'when custom unauthorized render options are configured' do
140
+ context "when custom unauthorized render options are configured" do
139
141
  controller do
140
142
  before_action :doorkeeper_authorize!
141
143
 
142
144
  include ControllerActions
143
145
  end
144
146
 
145
- context 'with a JSON custom render', token: :invalid do
147
+ context "with a JSON custom render", token: :invalid do
146
148
  before do
147
149
  module ControllerActions
148
150
  remove_method :doorkeeper_unauthorized_render_options
@@ -157,29 +159,28 @@ describe 'doorkeeper authorize filter' do
157
159
  module ControllerActions
158
160
  remove_method :doorkeeper_unauthorized_render_options
159
161
 
160
- def doorkeeper_unauthorized_render_options(error: nil)
161
- end
162
+ def doorkeeper_unauthorized_render_options(error: nil); end
162
163
  end
163
164
  end
164
165
 
165
- it 'it renders a custom JSON response', token: :invalid do
166
+ it "it renders a custom JSON response", token: :invalid do
166
167
  get :index, params: { access_token: token_string }
167
168
  expect(response.status).to eq 401
168
- expect(response.content_type).to eq('application/json')
169
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
169
+ expect(response.content_type).to eq("application/json")
170
+ expect(response.header["WWW-Authenticate"]).to match(/^Bearer/)
170
171
 
171
172
  expect(json_response).not_to be_nil
172
- expect(json_response['error_message']).to match('token is invalid')
173
+ expect(json_response["error_message"]).to match("token is invalid")
173
174
  end
174
175
  end
175
176
 
176
- context 'with a text custom render', token: :invalid do
177
+ context "with a text custom render", token: :invalid do
177
178
  before do
178
179
  module ControllerActions
179
180
  remove_method :doorkeeper_unauthorized_render_options
180
181
 
181
182
  def doorkeeper_unauthorized_render_options(**)
182
- { plain: 'Unauthorized' }
183
+ { plain: "Unauthorized" }
183
184
  end
184
185
  end
185
186
  end
@@ -192,17 +193,17 @@ describe 'doorkeeper authorize filter' do
192
193
  end
193
194
  end
194
195
 
195
- it 'it renders a custom text response', token: :invalid do
196
+ it "it renders a custom text response", token: :invalid do
196
197
  get :index, params: { access_token: token_string }
197
198
  expect(response.status).to eq 401
198
- expect(response.content_type).to eq('text/plain')
199
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
200
- expect(response.body).to eq('Unauthorized')
199
+ expect(response.content_type).to eq("text/plain")
200
+ expect(response.header["WWW-Authenticate"]).to match(/^Bearer/)
201
+ expect(response.body).to eq("Unauthorized")
201
202
  end
202
203
  end
203
204
  end
204
205
 
205
- context 'when custom forbidden render options are configured' do
206
+ context "when custom forbidden render options are configured" do
206
207
  before do
207
208
  expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
208
209
  expect(token).to receive(:acceptable?).with([:write]).and_return(false)
@@ -224,86 +225,129 @@ describe 'doorkeeper authorize filter' do
224
225
 
225
226
  let(:token) do
226
227
  double(Doorkeeper::AccessToken,
227
- accessible?: true, scopes: ['public'], revoked?: false,
228
+ accessible?: true, scopes: ["public"], revoked?: false,
228
229
  expired?: false, previous_refresh_token: "",
229
230
  revoke_previous_refresh_token!: true)
230
231
  end
231
232
 
232
- let(:token_string) { '1A2DUWE' }
233
+ let(:token_string) { "1A2DUWE" }
233
234
 
234
- context 'with a JSON custom render' do
235
+ context "with a JSON custom render" do
235
236
  before do
236
237
  module ControllerActions
237
238
  remove_method :doorkeeper_forbidden_render_options
238
239
 
239
240
  def doorkeeper_forbidden_render_options(*)
240
- { json: { error_message: 'Forbidden' } }
241
+ { json: { error_message: "Forbidden" } }
241
242
  end
242
243
  end
243
244
  end
244
245
 
245
- it 'renders a custom JSON response' do
246
+ it "renders a custom JSON response" do
246
247
  get :index, params: { access_token: token_string }
247
- expect(response.header).to_not include('WWW-Authenticate')
248
- expect(response.content_type).to eq('application/json')
248
+ expect(response.header).to_not include("WWW-Authenticate")
249
+ expect(response.content_type).to eq("application/json")
249
250
  expect(response.status).to eq 403
250
251
 
251
252
  expect(json_response).not_to be_nil
252
- expect(json_response['error_message']).to match('Forbidden')
253
+ expect(json_response["error_message"]).to match("Forbidden")
253
254
  end
254
255
  end
255
256
 
256
- context 'with a status and JSON custom render' do
257
+ context "with a status and JSON custom render" do
257
258
  before do
258
259
  module ControllerActions
259
260
  remove_method :doorkeeper_forbidden_render_options
260
261
  def doorkeeper_forbidden_render_options(*)
261
- { json: { error_message: 'Not Found' },
262
- respond_not_found_when_forbidden: true }
262
+ { json: { error_message: "Not Found" },
263
+ respond_not_found_when_forbidden: true, }
263
264
  end
264
265
  end
265
266
  end
266
267
 
267
- it 'overrides the default status code' do
268
+ it "overrides the default status code" do
268
269
  get :index, params: { access_token: token_string }
269
270
  expect(response.status).to eq 404
270
271
  end
271
272
  end
272
273
 
273
- context 'with a text custom render' do
274
+ context "with a text custom render" do
274
275
  before do
275
276
  module ControllerActions
276
277
  remove_method :doorkeeper_forbidden_render_options
277
278
 
278
279
  def doorkeeper_forbidden_render_options(*)
279
- { plain: 'Forbidden' }
280
+ { plain: "Forbidden" }
280
281
  end
281
282
  end
282
283
  end
283
284
 
284
- it 'renders a custom status code and text response' do
285
+ it "renders a custom status code and text response" do
285
286
  get :index, params: { access_token: token_string }
286
- expect(response.header).to_not include('WWW-Authenticate')
287
+ expect(response.header).to_not include("WWW-Authenticate")
287
288
  expect(response.status).to eq 403
288
- expect(response.body).to eq('Forbidden')
289
+ expect(response.body).to eq("Forbidden")
289
290
  end
290
291
  end
291
292
 
292
- context 'with a status and text custom render' do
293
+ context "with a status and text custom render" do
293
294
  before do
294
295
  module ControllerActions
295
296
  remove_method :doorkeeper_forbidden_render_options
296
297
 
297
298
  def doorkeeper_forbidden_render_options(*)
298
- { respond_not_found_when_forbidden: true, plain: 'Not Found' }
299
+ { respond_not_found_when_forbidden: true, plain: "Not Found" }
299
300
  end
300
301
  end
301
302
  end
302
303
 
303
- it 'overrides the default status code' do
304
+ it "overrides the default status code" do
304
305
  get :index, params: { access_token: token_string }
305
306
  expect(response.status).to eq 404
306
307
  end
307
308
  end
308
309
  end
310
+
311
+ context "when handle_auth_errors option is set to :raise" do
312
+ subject { get :index, params: { access_token: token_string } }
313
+
314
+ before do
315
+ config_is_set(:handle_auth_errors, :raise)
316
+ end
317
+
318
+ controller do
319
+ before_action :doorkeeper_authorize!
320
+ include ControllerActions
321
+ end
322
+
323
+ context "when token is unknown" do
324
+ it "raises Doorkeeper::Errors::TokenUnknown exception", token: :invalid do
325
+ expect { subject }.to raise_error(Doorkeeper::Errors::TokenUnknown)
326
+ end
327
+ end
328
+
329
+ context "when token is expired" do
330
+ it "raises Doorkeeper::Errors::TokenExpired exception", token: :expired do
331
+ expect { subject }.to raise_error(Doorkeeper::Errors::TokenExpired)
332
+ end
333
+ end
334
+
335
+ context "when token is revoked" do
336
+ it "raises Doorkeeper::Errors::TokenRevoked exception", token: :revoked do
337
+ expect { subject }.to raise_error(Doorkeeper::Errors::TokenRevoked)
338
+ end
339
+ end
340
+
341
+ context "when token is forbidden" do
342
+ it "raises Doorkeeper::Errors::TokenForbidden exception", token: :forbidden do
343
+ expect { subject }.to raise_error(Doorkeeper::Errors::TokenForbidden)
344
+ end
345
+ end
346
+
347
+ context "when token is valid" do
348
+ it "allows into index action", token: :valid do
349
+ expect(response).to be_successful
350
+ end
351
+ end
352
+ end
309
353
  end
@@ -1,46 +1,48 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
2
4
 
3
5
  describe Doorkeeper::TokenInfoController do
4
- describe 'when requesting token info with valid token' do
6
+ describe "when requesting token info with valid token" do
5
7
  let(:doorkeeper_token) { FactoryBot.create(:access_token) }
6
8
 
7
- describe 'successful request' do
8
- it 'responds with token info' do
9
+ describe "successful request" do
10
+ it "responds with token info" do
9
11
  get :show, params: { access_token: doorkeeper_token.token }
10
12
 
11
13
  expect(response.body).to eq(doorkeeper_token.to_json)
12
14
  end
13
15
 
14
- it 'responds with a 200 status' do
16
+ it "responds with a 200 status" do
15
17
  get :show, params: { access_token: doorkeeper_token.token }
16
18
 
17
19
  expect(response.status).to eq 200
18
20
  end
19
21
  end
20
22
 
21
- describe 'invalid token response' do
22
- it 'responds with 401 when doorkeeper_token is not valid' do
23
+ describe "invalid token response" do
24
+ it "responds with 401 when doorkeeper_token is not valid" do
23
25
  get :show
24
26
 
25
27
  expect(response.status).to eq 401
26
- expect(response.headers['WWW-Authenticate']).to match(/^Bearer/)
28
+ expect(response.headers["WWW-Authenticate"]).to match(/^Bearer/)
27
29
  end
28
30
 
29
- it 'responds with 401 when doorkeeper_token is invalid, expired or revoked' do
31
+ it "responds with 401 when doorkeeper_token is invalid, expired or revoked" do
30
32
  allow(controller).to receive(:doorkeeper_token).and_return(doorkeeper_token)
31
33
  allow(doorkeeper_token).to receive(:accessible?).and_return(false)
32
34
 
33
35
  get :show
34
36
 
35
37
  expect(response.status).to eq 401
36
- expect(response.headers['WWW-Authenticate']).to match(/^Bearer/)
38
+ expect(response.headers["WWW-Authenticate"]).to match(/^Bearer/)
37
39
  end
38
40
 
39
- it 'responds body message for error' do
41
+ it "responds body message for error" do
40
42
  get :show
41
43
 
42
44
  expect(response.body).to eq(
43
- Doorkeeper::OAuth::ErrorResponse.new(name: :invalid_request, status: :unauthorized).body.to_json
45
+ Doorkeeper::OAuth::InvalidTokenResponse.new.body.to_json
44
46
  )
45
47
  end
46
48
  end