doorkeeper 4.4.3 → 5.5.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of doorkeeper might be problematic. Click here for more details.

Files changed (282) hide show
  1. checksums.yaml +5 -5
  2. data/{NEWS.md → CHANGELOG.md} +393 -19
  3. data/README.md +97 -393
  4. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +8 -5
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +7 -11
  7. data/app/controllers/doorkeeper/applications_controller.rb +62 -27
  8. data/app/controllers/doorkeeper/authorizations_controller.rb +97 -17
  9. data/app/controllers/doorkeeper/authorized_applications_controller.rb +22 -3
  10. data/app/controllers/doorkeeper/token_info_controller.rb +16 -4
  11. data/app/controllers/doorkeeper/tokens_controller.rb +98 -32
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +9 -7
  13. data/app/views/doorkeeper/applications/_delete_form.html.erb +3 -1
  14. data/app/views/doorkeeper/applications/_form.html.erb +27 -26
  15. data/app/views/doorkeeper/applications/edit.html.erb +1 -1
  16. data/app/views/doorkeeper/applications/index.html.erb +17 -7
  17. data/app/views/doorkeeper/applications/new.html.erb +1 -1
  18. data/app/views/doorkeeper/applications/show.html.erb +38 -17
  19. data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
  20. data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
  21. data/app/views/doorkeeper/authorizations/new.html.erb +6 -0
  22. data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
  23. data/config/locales/en.yml +23 -3
  24. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  25. data/lib/doorkeeper/config/option.rb +82 -0
  26. data/lib/doorkeeper/config/validations.rb +53 -0
  27. data/lib/doorkeeper/config.rb +471 -140
  28. data/lib/doorkeeper/engine.rb +8 -2
  29. data/lib/doorkeeper/errors.rb +25 -16
  30. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  31. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  32. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  33. data/lib/doorkeeper/grant_flow.rb +45 -0
  34. data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
  35. data/lib/doorkeeper/grape/helpers.rb +13 -7
  36. data/lib/doorkeeper/helpers/controller.rb +43 -10
  37. data/lib/doorkeeper/models/access_grant_mixin.rb +97 -3
  38. data/lib/doorkeeper/models/access_token_mixin.rb +272 -66
  39. data/lib/doorkeeper/models/application_mixin.rb +50 -5
  40. data/lib/doorkeeper/models/concerns/accessible.rb +2 -0
  41. data/lib/doorkeeper/models/concerns/expirable.rb +7 -3
  42. data/lib/doorkeeper/models/concerns/orderable.rb +2 -0
  43. data/lib/doorkeeper/models/concerns/ownership.rb +4 -7
  44. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  45. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  46. data/lib/doorkeeper/models/concerns/revocable.rb +3 -27
  47. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  48. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  49. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  50. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  51. data/lib/doorkeeper/oauth/authorization/token.rb +58 -24
  52. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +7 -5
  53. data/lib/doorkeeper/oauth/authorization_code_request.rb +58 -10
  54. data/lib/doorkeeper/oauth/base_request.rb +35 -24
  55. data/lib/doorkeeper/oauth/base_response.rb +2 -0
  56. data/lib/doorkeeper/oauth/client/credentials.rb +5 -5
  57. data/lib/doorkeeper/oauth/client.rb +10 -11
  58. data/lib/doorkeeper/oauth/client_credentials/creator.rb +47 -4
  59. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +16 -9
  60. data/lib/doorkeeper/oauth/client_credentials/validator.rb +56 -0
  61. data/lib/doorkeeper/oauth/client_credentials_request.rb +10 -11
  62. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  63. data/lib/doorkeeper/oauth/code_response.rb +27 -15
  64. data/lib/doorkeeper/oauth/error.rb +3 -1
  65. data/lib/doorkeeper/oauth/error_response.rb +35 -14
  66. data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
  67. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -18
  68. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  69. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +42 -7
  70. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  71. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  72. data/lib/doorkeeper/oauth/invalid_token_response.rb +29 -4
  73. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  74. data/lib/doorkeeper/oauth/password_access_token_request.rb +43 -10
  75. data/lib/doorkeeper/oauth/pre_authorization.rb +133 -26
  76. data/lib/doorkeeper/oauth/refresh_token_request.rb +59 -31
  77. data/lib/doorkeeper/oauth/scopes.rb +8 -4
  78. data/lib/doorkeeper/oauth/token.rb +12 -8
  79. data/lib/doorkeeper/oauth/token_introspection.rb +97 -23
  80. data/lib/doorkeeper/oauth/token_request.rb +8 -20
  81. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  82. data/lib/doorkeeper/oauth.rb +13 -0
  83. data/lib/doorkeeper/orm/active_record/access_grant.rb +5 -30
  84. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -43
  85. data/lib/doorkeeper/orm/active_record/application.rb +6 -57
  86. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
  87. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
  88. data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
  89. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  90. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  91. data/lib/doorkeeper/orm/active_record.rb +27 -9
  92. data/lib/doorkeeper/rails/helpers.rb +10 -8
  93. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  94. data/lib/doorkeeper/rails/routes/mapper.rb +4 -2
  95. data/lib/doorkeeper/rails/routes/mapping.rb +9 -7
  96. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  97. data/lib/doorkeeper/rails/routes.rb +37 -30
  98. data/lib/doorkeeper/rake/db.rake +40 -0
  99. data/lib/doorkeeper/rake/setup.rake +11 -0
  100. data/lib/doorkeeper/rake.rb +14 -0
  101. data/lib/doorkeeper/request/authorization_code.rb +6 -4
  102. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  103. data/lib/doorkeeper/request/code.rb +1 -1
  104. data/lib/doorkeeper/request/password.rb +4 -3
  105. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  106. data/lib/doorkeeper/request/strategy.rb +4 -2
  107. data/lib/doorkeeper/request/token.rb +1 -1
  108. data/lib/doorkeeper/request.rb +61 -34
  109. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  110. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  111. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  112. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  113. data/lib/doorkeeper/server.rb +9 -11
  114. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  115. data/lib/doorkeeper/validations.rb +2 -0
  116. data/lib/doorkeeper/version.rb +7 -29
  117. data/lib/doorkeeper.rb +111 -64
  118. data/lib/generators/doorkeeper/application_owner_generator.rb +24 -18
  119. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  120. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  121. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  122. data/lib/generators/doorkeeper/migration_generator.rb +23 -18
  123. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  124. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +28 -22
  125. data/{spec/dummy/db/migrate/20180210183654_add_confidential_to_application.rb → lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb} +2 -2
  126. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +3 -1
  127. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
  128. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  129. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  130. data/lib/generators/doorkeeper/templates/initializer.rb +382 -30
  131. data/lib/generators/doorkeeper/templates/migration.rb.erb +35 -16
  132. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  133. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  134. metadata +95 -309
  135. data/.coveralls.yml +0 -1
  136. data/.github/ISSUE_TEMPLATE.md +0 -25
  137. data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  138. data/.gitignore +0 -19
  139. data/.hound.yml +0 -2
  140. data/.rspec +0 -1
  141. data/.rubocop.yml +0 -17
  142. data/.travis.yml +0 -38
  143. data/Appraisals +0 -18
  144. data/CODE_OF_CONDUCT.md +0 -46
  145. data/CONTRIBUTING.md +0 -47
  146. data/Gemfile +0 -10
  147. data/RELEASING.md +0 -10
  148. data/Rakefile +0 -20
  149. data/SECURITY.md +0 -15
  150. data/app/validators/redirect_uri_validator.rb +0 -44
  151. data/doorkeeper.gemspec +0 -32
  152. data/gemfiles/rails_4_2.gemfile +0 -13
  153. data/gemfiles/rails_5_0.gemfile +0 -12
  154. data/gemfiles/rails_5_1.gemfile +0 -12
  155. data/gemfiles/rails_5_2.gemfile +0 -12
  156. data/gemfiles/rails_master.gemfile +0 -14
  157. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  158. data/lib/generators/doorkeeper/add_client_confidentiality_generator.rb +0 -31
  159. data/lib/generators/doorkeeper/templates/add_confidential_to_application_migration.rb.erb +0 -11
  160. data/spec/controllers/application_metal_controller.rb +0 -10
  161. data/spec/controllers/applications_controller_spec.rb +0 -69
  162. data/spec/controllers/authorizations_controller_spec.rb +0 -250
  163. data/spec/controllers/protected_resources_controller_spec.rb +0 -309
  164. data/spec/controllers/token_info_controller_spec.rb +0 -56
  165. data/spec/controllers/tokens_controller_spec.rb +0 -274
  166. data/spec/dummy/Rakefile +0 -7
  167. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  168. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  169. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  170. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  171. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  172. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  173. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  174. data/spec/dummy/app/models/user.rb +0 -5
  175. data/spec/dummy/app/views/home/index.html.erb +0 -0
  176. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  177. data/spec/dummy/config/application.rb +0 -23
  178. data/spec/dummy/config/boot.rb +0 -9
  179. data/spec/dummy/config/database.yml +0 -15
  180. data/spec/dummy/config/environment.rb +0 -5
  181. data/spec/dummy/config/environments/development.rb +0 -29
  182. data/spec/dummy/config/environments/production.rb +0 -62
  183. data/spec/dummy/config/environments/test.rb +0 -44
  184. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  185. data/spec/dummy/config/initializers/doorkeeper.rb +0 -112
  186. data/spec/dummy/config/initializers/new_framework_defaults.rb +0 -6
  187. data/spec/dummy/config/initializers/secret_token.rb +0 -8
  188. data/spec/dummy/config/initializers/session_store.rb +0 -8
  189. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  190. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  191. data/spec/dummy/config/routes.rb +0 -52
  192. data/spec/dummy/config.ru +0 -4
  193. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  194. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  195. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -62
  196. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  197. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  198. data/spec/dummy/db/schema.rb +0 -68
  199. data/spec/dummy/public/404.html +0 -26
  200. data/spec/dummy/public/422.html +0 -26
  201. data/spec/dummy/public/500.html +0 -26
  202. data/spec/dummy/public/favicon.ico +0 -0
  203. data/spec/dummy/script/rails +0 -6
  204. data/spec/factories.rb +0 -28
  205. data/spec/generators/application_owner_generator_spec.rb +0 -41
  206. data/spec/generators/install_generator_spec.rb +0 -31
  207. data/spec/generators/migration_generator_spec.rb +0 -41
  208. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -57
  209. data/spec/generators/templates/routes.rb +0 -3
  210. data/spec/generators/views_generator_spec.rb +0 -27
  211. data/spec/grape/grape_integration_spec.rb +0 -135
  212. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  213. data/spec/lib/config_spec.rb +0 -462
  214. data/spec/lib/doorkeeper_spec.rb +0 -150
  215. data/spec/lib/models/expirable_spec.rb +0 -50
  216. data/spec/lib/models/revocable_spec.rb +0 -59
  217. data/spec/lib/models/scopes_spec.rb +0 -43
  218. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -41
  219. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -123
  220. data/spec/lib/oauth/base_request_spec.rb +0 -155
  221. data/spec/lib/oauth/base_response_spec.rb +0 -45
  222. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  223. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  224. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  225. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  226. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  227. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -105
  228. data/spec/lib/oauth/client_spec.rb +0 -39
  229. data/spec/lib/oauth/code_request_spec.rb +0 -43
  230. data/spec/lib/oauth/code_response_spec.rb +0 -34
  231. data/spec/lib/oauth/error_response_spec.rb +0 -61
  232. data/spec/lib/oauth/error_spec.rb +0 -23
  233. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
  234. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
  235. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
  236. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -218
  237. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -56
  238. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -96
  239. data/spec/lib/oauth/pre_authorization_spec.rb +0 -160
  240. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -166
  241. data/spec/lib/oauth/scopes_spec.rb +0 -149
  242. data/spec/lib/oauth/token_request_spec.rb +0 -96
  243. data/spec/lib/oauth/token_response_spec.rb +0 -85
  244. data/spec/lib/oauth/token_spec.rb +0 -116
  245. data/spec/lib/request/strategy_spec.rb +0 -53
  246. data/spec/lib/server_spec.rb +0 -59
  247. data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
  248. data/spec/models/doorkeeper/access_token_spec.rb +0 -418
  249. data/spec/models/doorkeeper/application_spec.rb +0 -303
  250. data/spec/requests/applications/applications_request_spec.rb +0 -94
  251. data/spec/requests/applications/authorized_applications_spec.rb +0 -30
  252. data/spec/requests/endpoints/authorization_spec.rb +0 -71
  253. data/spec/requests/endpoints/token_spec.rb +0 -71
  254. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -76
  255. data/spec/requests/flows/authorization_code_spec.rb +0 -149
  256. data/spec/requests/flows/client_credentials_spec.rb +0 -86
  257. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
  258. data/spec/requests/flows/implicit_grant_spec.rb +0 -61
  259. data/spec/requests/flows/password_spec.rb +0 -197
  260. data/spec/requests/flows/refresh_token_spec.rb +0 -174
  261. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  262. data/spec/requests/flows/skip_authorization_spec.rb +0 -59
  263. data/spec/requests/protected_resources/metal_spec.rb +0 -14
  264. data/spec/requests/protected_resources/private_api_spec.rb +0 -81
  265. data/spec/routing/custom_controller_routes_spec.rb +0 -75
  266. data/spec/routing/default_routes_spec.rb +0 -39
  267. data/spec/routing/scoped_routes_spec.rb +0 -31
  268. data/spec/spec_helper.rb +0 -4
  269. data/spec/spec_helper_integration.rb +0 -74
  270. data/spec/support/dependencies/factory_girl.rb +0 -2
  271. data/spec/support/helpers/access_token_request_helper.rb +0 -11
  272. data/spec/support/helpers/authorization_request_helper.rb +0 -41
  273. data/spec/support/helpers/config_helper.rb +0 -9
  274. data/spec/support/helpers/model_helper.rb +0 -72
  275. data/spec/support/helpers/request_spec_helper.rb +0 -88
  276. data/spec/support/helpers/url_helper.rb +0 -56
  277. data/spec/support/http_method_shim.rb +0 -38
  278. data/spec/support/orm/active_record.rb +0 -3
  279. data/spec/support/shared/controllers_shared_context.rb +0 -65
  280. data/spec/support/shared/models_shared_examples.rb +0 -52
  281. data/spec/validators/redirect_uri_validator_spec.rb +0 -123
  282. data/spec/version/version_spec.rb +0 -15
@@ -1,166 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe RefreshTokenRequest do
5
- before do
6
- allow(Doorkeeper::AccessToken).to receive(:refresh_token_revoked_on_use?).and_return(false)
7
- end
8
-
9
- let(:server) do
10
- double :server,
11
- access_token_expires_in: 2.minutes,
12
- custom_access_token_expires_in: -> (_oauth_client) { nil }
13
- end
14
-
15
- let(:refresh_token) do
16
- FactoryBot.create(:access_token, use_refresh_token: true)
17
- end
18
-
19
- let(:client) { refresh_token.application }
20
- let(:credentials) { Client::Credentials.new(client.uid, client.secret) }
21
-
22
- subject { RefreshTokenRequest.new server, refresh_token, credentials }
23
-
24
- it 'issues a new token for the client' do
25
- expect { subject.authorize }.to change { client.reload.access_tokens.count }.by(1)
26
- # #sort_by used for MongoDB ORM extensions for valid ordering
27
- expect(client.reload.access_tokens.sort_by(&:created_at).last.expires_in).to eq(120)
28
- end
29
-
30
- it 'issues a new token for the client with custom expires_in' do
31
- server = double :server,
32
- access_token_expires_in: 2.minutes,
33
- custom_access_token_expires_in: ->(_oauth_client) { 1234 }
34
-
35
- allow(Doorkeeper::AccessToken).to receive(:refresh_token_revoked_on_use?).and_return(false)
36
-
37
- RefreshTokenRequest.new(server, refresh_token, credentials).authorize
38
-
39
- # #sort_by used for MongoDB ORM extensions for valid ordering
40
- expect(client.reload.access_tokens.sort_by(&:created_at).last.expires_in).to eq(1234)
41
- end
42
-
43
- it 'revokes the previous token' do
44
- expect { subject.authorize }.to change { refresh_token.revoked? }.from(false).to(true)
45
- end
46
-
47
- it "calls configured request callback methods" do
48
- expect(Doorkeeper.configuration.before_successful_strategy_response).to receive(:call).with(subject).once
49
- expect(Doorkeeper.configuration.after_successful_strategy_response).to receive(:call).with(subject, instance_of(Doorkeeper::OAuth::TokenResponse)).once
50
- subject.authorize
51
- end
52
-
53
- it 'requires the refresh token' do
54
- subject.refresh_token = nil
55
- subject.validate
56
- expect(subject.error).to eq(:invalid_request)
57
- end
58
-
59
- it 'requires credentials to be valid if provided' do
60
- subject.client = nil
61
- subject.validate
62
- expect(subject.error).to eq(:invalid_client)
63
- end
64
-
65
- it "requires the token's client and current client to match" do
66
- subject.client = FactoryBot.create(:application)
67
- subject.validate
68
- expect(subject.error).to eq(:invalid_grant)
69
- end
70
-
71
- it 'rejects revoked tokens' do
72
- refresh_token.revoke
73
- subject.validate
74
- expect(subject.error).to eq(:invalid_grant)
75
- end
76
-
77
- it 'accepts expired tokens' do
78
- refresh_token.expires_in = -1
79
- refresh_token.save
80
- subject.validate
81
- expect(subject).to be_valid
82
- end
83
-
84
- context 'refresh tokens expire on access token use' do
85
- let(:server) do
86
- double :server,
87
- access_token_expires_in: 2.minutes,
88
- custom_access_token_expires_in: ->(_oauth_client) { 1234 }
89
- end
90
-
91
- before do
92
- allow(Doorkeeper::AccessToken).to receive(:refresh_token_revoked_on_use?).and_return(true)
93
- end
94
-
95
- it 'issues a new token for the client' do
96
- expect { subject.authorize }.to change { client.reload.access_tokens.count }.by(1)
97
- end
98
-
99
- it 'does not revoke the previous token' do
100
- subject.authorize
101
- expect(refresh_token).not_to be_revoked
102
- end
103
-
104
- it 'sets the previous refresh token in the new access token' do
105
- subject.authorize
106
- expect(
107
- # #sort_by used for MongoDB ORM extensions for valid ordering
108
- client.access_tokens.sort_by(&:created_at).last.previous_refresh_token
109
- ).to eq(refresh_token.refresh_token)
110
- end
111
- end
112
-
113
- context 'clientless access tokens' do
114
- let!(:refresh_token) { FactoryBot.create(:clientless_access_token, use_refresh_token: true) }
115
-
116
- subject { RefreshTokenRequest.new server, refresh_token, nil }
117
-
118
- it 'issues a new token without a client' do
119
- expect { subject.authorize }.to change { Doorkeeper::AccessToken.count }.by(1)
120
- end
121
- end
122
-
123
- context 'with scopes' do
124
- let(:refresh_token) do
125
- FactoryBot.create :access_token,
126
- use_refresh_token: true,
127
- scopes: 'public write'
128
- end
129
- let(:parameters) { {} }
130
- subject { RefreshTokenRequest.new server, refresh_token, credentials, parameters }
131
-
132
- it 'transfers scopes from the old token to the new token' do
133
- subject.authorize
134
- expect(Doorkeeper::AccessToken.last.scopes).to eq([:public, :write])
135
- end
136
-
137
- it 'reduces scopes to the provided scopes' do
138
- parameters[:scopes] = 'public'
139
- subject.authorize
140
- expect(Doorkeeper::AccessToken.last.scopes).to eq([:public])
141
- end
142
-
143
- it 'validates that scopes are included in the original access token' do
144
- parameters[:scopes] = 'public update'
145
-
146
- subject.validate
147
- expect(subject.error).to eq(:invalid_scope)
148
- end
149
-
150
- it 'uses params[:scope] in favor of scopes if present (valid)' do
151
- parameters[:scopes] = 'public update'
152
- parameters[:scope] = 'public'
153
- subject.authorize
154
- expect(Doorkeeper::AccessToken.last.scopes).to eq([:public])
155
- end
156
-
157
- it 'uses params[:scope] in favor of scopes if present (invalid)' do
158
- parameters[:scopes] = 'public'
159
- parameters[:scope] = 'public update'
160
-
161
- subject.validate
162
- expect(subject.error).to eq(:invalid_scope)
163
- end
164
- end
165
- end
166
- end
@@ -1,149 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/module/delegation'
3
- require 'active_support/core_ext/string'
4
- require 'doorkeeper/oauth/scopes'
5
-
6
- module Doorkeeper::OAuth
7
- describe Scopes do
8
- describe '#add' do
9
- it 'allows you to add scopes with symbols' do
10
- subject.add :public
11
- expect(subject.all).to eq(['public'])
12
- end
13
-
14
- it 'allows you to add scopes with strings' do
15
- subject.add 'public'
16
- expect(subject.all).to eq(['public'])
17
- end
18
-
19
- it 'do not add already included scopes' do
20
- subject.add :public
21
- subject.add :public
22
- expect(subject.all).to eq(['public'])
23
- end
24
- end
25
-
26
- describe '#exists' do
27
- before do
28
- subject.add :public
29
- end
30
-
31
- it 'returns true if scope with given name is present' do
32
- expect(subject.exists?('public')).to be_truthy
33
- end
34
-
35
- it 'returns false if scope with given name does not exist' do
36
- expect(subject.exists?('other')).to be_falsey
37
- end
38
-
39
- it 'handles symbols' do
40
- expect(subject.exists?(:public)).to be_truthy
41
- expect(subject.exists?(:other)).to be_falsey
42
- end
43
- end
44
-
45
- describe '.from_string' do
46
- let(:string) { 'public write' }
47
-
48
- subject { Scopes.from_string(string) }
49
-
50
- it { expect(subject).to be_a(Scopes) }
51
-
52
- describe '#all' do
53
- it 'should be an array of the expected scopes' do
54
- scopes_array = subject.all
55
- expect(scopes_array.size).to eq(2)
56
- expect(scopes_array).to include('public')
57
- expect(scopes_array).to include('write')
58
- end
59
- end
60
- end
61
-
62
- describe '#+' do
63
- it 'can add to another scope object' do
64
- scopes = Scopes.from_string('public') + Scopes.from_string('admin')
65
- expect(scopes.all).to eq(%w[public admin])
66
- end
67
-
68
- it 'does not change the existing object' do
69
- origin = Scopes.from_string('public')
70
- expect(origin.to_s).to eq('public')
71
- end
72
-
73
- it 'can add an array to a scope object' do
74
- scopes = Scopes.from_string('public') + ['admin']
75
- expect(scopes.all).to eq(%w[public admin])
76
- end
77
-
78
- it 'raises an error if cannot handle addition' do
79
- expect do
80
- Scopes.from_string('public') + 'admin'
81
- end.to raise_error(NoMethodError)
82
- end
83
- end
84
-
85
- describe '#&' do
86
- it 'can get intersection with another scope object' do
87
- scopes = Scopes.from_string('public admin') & Scopes.from_string('write admin')
88
- expect(scopes.all).to eq(%w[admin])
89
- end
90
-
91
- it 'does not change the existing object' do
92
- origin = Scopes.from_string('public admin')
93
- origin & Scopes.from_string('write admin')
94
- expect(origin.to_s).to eq('public admin')
95
- end
96
-
97
- it 'can get intersection with an array' do
98
- scopes = Scopes.from_string('public admin') & %w[write admin]
99
- expect(scopes.all).to eq(%w[admin])
100
- end
101
- end
102
-
103
- describe '#==' do
104
- it 'is equal to another set of scopes' do
105
- expect(Scopes.from_string('public')).to eq(Scopes.from_string('public'))
106
- end
107
-
108
- it 'is equal to another set of scopes with no particular order' do
109
- expect(Scopes.from_string('public write')).to eq(Scopes.from_string('write public'))
110
- end
111
-
112
- it 'differs from another set of scopes when scopes are not the same' do
113
- expect(Scopes.from_string('public write')).not_to eq(Scopes.from_string('write'))
114
- end
115
-
116
- it "does not raise an error when compared to a non-enumerable object" do
117
- expect { Scopes.from_string("public") == false }.not_to raise_error
118
- end
119
- end
120
-
121
- describe '#has_scopes?' do
122
- subject { Scopes.from_string('public admin') }
123
-
124
- it 'returns true when at least one scope is included' do
125
- expect(subject.has_scopes?(Scopes.from_string('public'))).to be_truthy
126
- end
127
-
128
- it 'returns true when all scopes are included' do
129
- expect(subject.has_scopes?(Scopes.from_string('public admin'))).to be_truthy
130
- end
131
-
132
- it 'is true if all scopes are included in any order' do
133
- expect(subject.has_scopes?(Scopes.from_string('admin public'))).to be_truthy
134
- end
135
-
136
- it 'is false if no scopes are included' do
137
- expect(subject.has_scopes?(Scopes.from_string('notexistent'))).to be_falsey
138
- end
139
-
140
- it 'returns false when any scope is not included' do
141
- expect(subject.has_scopes?(Scopes.from_string('public nope'))).to be_falsey
142
- end
143
-
144
- it 'is false if no scopes are included even for existing ones' do
145
- expect(subject.has_scopes?(Scopes.from_string('public admin notexistent'))).to be_falsey
146
- end
147
- end
148
- end
149
- end
@@ -1,96 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe TokenRequest do
5
- let :application do
6
- scopes = double(all: ['public'])
7
- double(:application, id: 9990, scopes: scopes)
8
- end
9
-
10
- let :pre_auth do
11
- double(
12
- :pre_auth,
13
- client: application,
14
- redirect_uri: 'http://tst.com/cb',
15
- state: nil,
16
- scopes: Scopes.from_string('public'),
17
- error: nil,
18
- authorizable?: true
19
- )
20
- end
21
-
22
- let :owner do
23
- double :owner, id: 7866
24
- end
25
-
26
- subject do
27
- TokenRequest.new(pre_auth, owner)
28
- end
29
-
30
- it 'creates an access token' do
31
- expect do
32
- subject.authorize
33
- end.to change { Doorkeeper::AccessToken.count }.by(1)
34
- end
35
-
36
- it 'returns a code response' do
37
- expect(subject.authorize).to be_a(CodeResponse)
38
- end
39
-
40
- it 'does not create token when not authorizable' do
41
- allow(pre_auth).to receive(:authorizable?).and_return(false)
42
- expect { subject.authorize }.not_to change { Doorkeeper::AccessToken.count }
43
- end
44
-
45
- it 'returns a error response' do
46
- allow(pre_auth).to receive(:authorizable?).and_return(false)
47
- expect(subject.authorize).to be_a(ErrorResponse)
48
- end
49
-
50
- context 'with custom expirations' do
51
- before do
52
- Doorkeeper.configure do
53
- orm DOORKEEPER_ORM
54
- custom_access_token_expires_in do |_oauth_client|
55
- 1234
56
- end
57
- end
58
- end
59
-
60
- it 'should use the custom ttl' do
61
- subject.authorize
62
- token = Doorkeeper::AccessToken.first
63
- expect(token.expires_in).to eq(1234)
64
- end
65
- end
66
-
67
- context 'token reuse' do
68
- it 'creates a new token if there are no matching tokens' do
69
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
70
- expect do
71
- subject.authorize
72
- end.to change { Doorkeeper::AccessToken.count }.by(1)
73
- end
74
-
75
- it 'creates a new token if scopes do not match' do
76
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
77
- FactoryBot.create(:access_token, application_id: pre_auth.client.id,
78
- resource_owner_id: owner.id, scopes: '')
79
- expect do
80
- subject.authorize
81
- end.to change { Doorkeeper::AccessToken.count }.by(1)
82
- end
83
-
84
- it 'skips token creation if there is a matching one' do
85
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
86
- allow(application.scopes).to receive(:has_scopes?).and_return(true)
87
- allow(application.scopes).to receive(:all?).and_return(true)
88
-
89
- FactoryBot.create(:access_token, application_id: pre_auth.client.id,
90
- resource_owner_id: owner.id, scopes: 'public')
91
-
92
- expect { subject.authorize }.not_to change { Doorkeeper::AccessToken.count }
93
- end
94
- end
95
- end
96
- end
@@ -1,85 +0,0 @@
1
- require 'spec_helper'
2
- require 'doorkeeper/oauth/token_response'
3
-
4
- module Doorkeeper::OAuth
5
- describe TokenResponse do
6
- subject { TokenResponse.new(double.as_null_object) }
7
-
8
- it 'includes access token response headers' do
9
- headers = subject.headers
10
- expect(headers.fetch('Cache-Control')).to eq('no-store')
11
- expect(headers.fetch('Pragma')).to eq('no-cache')
12
- end
13
-
14
- it 'status is ok' do
15
- expect(subject.status).to eq(:ok)
16
- end
17
-
18
- describe '.body' do
19
- let(:access_token) do
20
- double :access_token,
21
- token: 'some-token',
22
- expires_in: '3600',
23
- expires_in_seconds: '300',
24
- scopes_string: 'two scopes',
25
- refresh_token: 'some-refresh-token',
26
- token_type: 'bearer',
27
- created_at: 0
28
- end
29
-
30
- subject { TokenResponse.new(access_token).body }
31
-
32
- it 'includes :access_token' do
33
- expect(subject['access_token']).to eq('some-token')
34
- end
35
-
36
- it 'includes :token_type' do
37
- expect(subject['token_type']).to eq('bearer')
38
- end
39
-
40
- # expires_in_seconds is returned as `expires_in` in order to match
41
- # the OAuth spec (section 4.2.2)
42
- it 'includes :expires_in' do
43
- expect(subject['expires_in']).to eq('300')
44
- end
45
-
46
- it 'includes :scope' do
47
- expect(subject['scope']).to eq('two scopes')
48
- end
49
-
50
- it 'includes :refresh_token' do
51
- expect(subject['refresh_token']).to eq('some-refresh-token')
52
- end
53
-
54
- it 'includes :created_at' do
55
- expect(subject['created_at']).to eq(0)
56
- end
57
- end
58
-
59
- describe '.body filters out empty values' do
60
- let(:access_token) do
61
- double :access_token,
62
- token: 'some-token',
63
- expires_in_seconds: '',
64
- scopes_string: '',
65
- refresh_token: '',
66
- token_type: 'bearer',
67
- created_at: 0
68
- end
69
-
70
- subject { TokenResponse.new(access_token).body }
71
-
72
- it 'includes :expires_in' do
73
- expect(subject['expires_in']).to be_nil
74
- end
75
-
76
- it 'includes :scope' do
77
- expect(subject['scope']).to be_nil
78
- end
79
-
80
- it 'includes :refresh_token' do
81
- expect(subject['refresh_token']).to be_nil
82
- end
83
- end
84
- end
85
- end