doorkeeper 4.2.6 → 5.5.4

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 (274) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1049 -0
  3. data/README.md +110 -353
  4. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +6 -7
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +7 -11
  7. data/app/controllers/doorkeeper/applications_controller.rb +65 -16
  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 +115 -38
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +10 -6
  13. data/app/views/doorkeeper/applications/_delete_form.html.erb +3 -1
  14. data/app/views/doorkeeper/applications/_form.html.erb +33 -21
  15. data/app/views/doorkeeper/applications/edit.html.erb +1 -1
  16. data/app/views/doorkeeper/applications/index.html.erb +18 -6
  17. data/app/views/doorkeeper/applications/new.html.erb +1 -1
  18. data/app/views/doorkeeper/applications/show.html.erb +40 -16
  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/doorkeeper/authorized_applications/index.html.erb +0 -1
  23. data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
  24. data/config/locales/en.yml +34 -7
  25. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  26. data/lib/doorkeeper/config/option.rb +82 -0
  27. data/lib/doorkeeper/config/validations.rb +53 -0
  28. data/lib/doorkeeper/config.rb +514 -167
  29. data/lib/doorkeeper/engine.rb +11 -5
  30. data/lib/doorkeeper/errors.rb +25 -16
  31. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  32. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  33. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  34. data/lib/doorkeeper/grant_flow.rb +45 -0
  35. data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
  36. data/lib/doorkeeper/grape/helpers.rb +23 -12
  37. data/lib/doorkeeper/helpers/controller.rb +51 -14
  38. data/lib/doorkeeper/models/access_grant_mixin.rb +94 -27
  39. data/lib/doorkeeper/models/access_token_mixin.rb +284 -96
  40. data/lib/doorkeeper/models/application_mixin.rb +58 -27
  41. data/lib/doorkeeper/models/concerns/accessible.rb +2 -0
  42. data/lib/doorkeeper/models/concerns/expirable.rb +12 -6
  43. data/lib/doorkeeper/models/concerns/orderable.rb +15 -0
  44. data/lib/doorkeeper/models/concerns/ownership.rb +4 -7
  45. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  46. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  47. data/lib/doorkeeper/models/concerns/revocable.rb +3 -27
  48. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  49. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  50. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  51. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  52. data/lib/doorkeeper/oauth/authorization/token.rb +66 -28
  53. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +7 -5
  54. data/lib/doorkeeper/oauth/authorization_code_request.rb +63 -10
  55. data/lib/doorkeeper/oauth/base_request.rb +35 -19
  56. data/lib/doorkeeper/oauth/base_response.rb +2 -0
  57. data/lib/doorkeeper/oauth/client/credentials.rb +9 -7
  58. data/lib/doorkeeper/oauth/client.rb +10 -11
  59. data/lib/doorkeeper/oauth/client_credentials/creator.rb +47 -4
  60. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +16 -9
  61. data/lib/doorkeeper/oauth/client_credentials/validator.rb +56 -0
  62. data/lib/doorkeeper/oauth/client_credentials_request.rb +10 -11
  63. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  64. data/lib/doorkeeper/oauth/code_response.rb +27 -15
  65. data/lib/doorkeeper/oauth/error.rb +5 -3
  66. data/lib/doorkeeper/oauth/error_response.rb +35 -15
  67. data/lib/doorkeeper/oauth/forbidden_token_response.rb +11 -3
  68. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -18
  69. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  70. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +53 -3
  71. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  72. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  73. data/lib/doorkeeper/oauth/invalid_token_response.rb +29 -5
  74. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  75. data/lib/doorkeeper/oauth/password_access_token_request.rb +44 -10
  76. data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
  77. data/lib/doorkeeper/oauth/refresh_token_request.rb +60 -31
  78. data/lib/doorkeeper/oauth/scopes.rb +26 -12
  79. data/lib/doorkeeper/oauth/token.rb +13 -9
  80. data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
  81. data/lib/doorkeeper/oauth/token_request.rb +8 -20
  82. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  83. data/lib/doorkeeper/oauth.rb +13 -0
  84. data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
  85. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -42
  86. data/lib/doorkeeper/orm/active_record/application.rb +6 -20
  87. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +69 -0
  88. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +60 -0
  89. data/lib/doorkeeper/orm/active_record/mixins/application.rb +199 -0
  90. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  91. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  92. data/lib/doorkeeper/orm/active_record.rb +37 -8
  93. data/lib/doorkeeper/rails/helpers.rb +14 -13
  94. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  95. data/lib/doorkeeper/rails/routes/mapper.rb +4 -2
  96. data/lib/doorkeeper/rails/routes/mapping.rb +9 -7
  97. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  98. data/lib/doorkeeper/rails/routes.rb +41 -28
  99. data/lib/doorkeeper/rake/db.rake +40 -0
  100. data/lib/doorkeeper/rake/setup.rake +11 -0
  101. data/lib/doorkeeper/rake.rb +14 -0
  102. data/lib/doorkeeper/request/authorization_code.rb +6 -4
  103. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  104. data/lib/doorkeeper/request/code.rb +1 -1
  105. data/lib/doorkeeper/request/password.rb +5 -14
  106. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  107. data/lib/doorkeeper/request/strategy.rb +4 -2
  108. data/lib/doorkeeper/request/token.rb +1 -1
  109. data/lib/doorkeeper/request.rb +62 -29
  110. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  111. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  112. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  113. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  114. data/lib/doorkeeper/server.rb +9 -11
  115. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  116. data/lib/doorkeeper/validations.rb +5 -2
  117. data/lib/doorkeeper/version.rb +12 -1
  118. data/lib/doorkeeper.rb +111 -62
  119. data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
  120. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  121. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  122. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  123. data/lib/generators/doorkeeper/migration_generator.rb +27 -10
  124. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  125. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +31 -19
  126. data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
  127. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
  128. data/{spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb → lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb} +3 -1
  129. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  130. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  131. data/lib/generators/doorkeeper/templates/initializer.rb +412 -33
  132. data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
  133. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  134. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  135. metadata +114 -276
  136. data/.coveralls.yml +0 -1
  137. data/.gitignore +0 -19
  138. data/.hound.yml +0 -13
  139. data/.rspec +0 -1
  140. data/.travis.yml +0 -26
  141. data/Appraisals +0 -14
  142. data/CONTRIBUTING.md +0 -47
  143. data/Gemfile +0 -10
  144. data/NEWS.md +0 -606
  145. data/RELEASING.md +0 -10
  146. data/Rakefile +0 -20
  147. data/app/validators/redirect_uri_validator.rb +0 -34
  148. data/doorkeeper.gemspec +0 -29
  149. data/gemfiles/rails_4_2.gemfile +0 -11
  150. data/gemfiles/rails_5_0.gemfile +0 -12
  151. data/gemfiles/rails_5_1.gemfile +0 -13
  152. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  153. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
  154. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb +0 -11
  155. data/lib/generators/doorkeeper/templates/migration.rb +0 -68
  156. data/spec/controllers/application_metal_controller.rb +0 -10
  157. data/spec/controllers/applications_controller_spec.rb +0 -58
  158. data/spec/controllers/authorizations_controller_spec.rb +0 -218
  159. data/spec/controllers/protected_resources_controller_spec.rb +0 -300
  160. data/spec/controllers/token_info_controller_spec.rb +0 -52
  161. data/spec/controllers/tokens_controller_spec.rb +0 -88
  162. data/spec/dummy/Rakefile +0 -7
  163. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  164. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  165. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  166. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  167. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  168. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  169. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  170. data/spec/dummy/app/models/user.rb +0 -5
  171. data/spec/dummy/app/views/home/index.html.erb +0 -0
  172. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  173. data/spec/dummy/config/application.rb +0 -23
  174. data/spec/dummy/config/boot.rb +0 -9
  175. data/spec/dummy/config/database.yml +0 -15
  176. data/spec/dummy/config/environment.rb +0 -5
  177. data/spec/dummy/config/environments/development.rb +0 -29
  178. data/spec/dummy/config/environments/production.rb +0 -62
  179. data/spec/dummy/config/environments/test.rb +0 -44
  180. data/spec/dummy/config/initializers/active_record_belongs_to_required_by_default.rb +0 -6
  181. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  182. data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
  183. data/spec/dummy/config/initializers/secret_token.rb +0 -9
  184. data/spec/dummy/config/initializers/session_store.rb +0 -8
  185. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  186. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  187. data/spec/dummy/config/routes.rb +0 -52
  188. data/spec/dummy/config.ru +0 -4
  189. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
  190. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
  191. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -60
  192. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -7
  193. data/spec/dummy/db/schema.rb +0 -67
  194. data/spec/dummy/public/404.html +0 -26
  195. data/spec/dummy/public/422.html +0 -26
  196. data/spec/dummy/public/500.html +0 -26
  197. data/spec/dummy/public/favicon.ico +0 -0
  198. data/spec/dummy/script/rails +0 -6
  199. data/spec/factories.rb +0 -28
  200. data/spec/generators/application_owner_generator_spec.rb +0 -22
  201. data/spec/generators/install_generator_spec.rb +0 -31
  202. data/spec/generators/migration_generator_spec.rb +0 -20
  203. data/spec/generators/templates/routes.rb +0 -3
  204. data/spec/generators/views_generator_spec.rb +0 -27
  205. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  206. data/spec/lib/config_spec.rb +0 -334
  207. data/spec/lib/doorkeeper_spec.rb +0 -150
  208. data/spec/lib/models/expirable_spec.rb +0 -50
  209. data/spec/lib/models/revocable_spec.rb +0 -59
  210. data/spec/lib/models/scopes_spec.rb +0 -43
  211. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -41
  212. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
  213. data/spec/lib/oauth/base_request_spec.rb +0 -160
  214. data/spec/lib/oauth/base_response_spec.rb +0 -45
  215. data/spec/lib/oauth/client/credentials_spec.rb +0 -88
  216. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  217. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  218. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  219. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  220. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
  221. data/spec/lib/oauth/client_spec.rb +0 -39
  222. data/spec/lib/oauth/code_request_spec.rb +0 -45
  223. data/spec/lib/oauth/code_response_spec.rb +0 -34
  224. data/spec/lib/oauth/error_response_spec.rb +0 -61
  225. data/spec/lib/oauth/error_spec.rb +0 -23
  226. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
  227. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
  228. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
  229. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -104
  230. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -56
  231. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -90
  232. data/spec/lib/oauth/pre_authorization_spec.rb +0 -155
  233. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -154
  234. data/spec/lib/oauth/scopes_spec.rb +0 -122
  235. data/spec/lib/oauth/token_request_spec.rb +0 -98
  236. data/spec/lib/oauth/token_response_spec.rb +0 -85
  237. data/spec/lib/oauth/token_spec.rb +0 -116
  238. data/spec/lib/request/strategy_spec.rb +0 -53
  239. data/spec/lib/server_spec.rb +0 -49
  240. data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
  241. data/spec/models/doorkeeper/access_token_spec.rb +0 -394
  242. data/spec/models/doorkeeper/application_spec.rb +0 -179
  243. data/spec/requests/applications/applications_request_spec.rb +0 -94
  244. data/spec/requests/applications/authorized_applications_spec.rb +0 -30
  245. data/spec/requests/endpoints/authorization_spec.rb +0 -71
  246. data/spec/requests/endpoints/token_spec.rb +0 -64
  247. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -76
  248. data/spec/requests/flows/authorization_code_spec.rb +0 -148
  249. data/spec/requests/flows/client_credentials_spec.rb +0 -58
  250. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
  251. data/spec/requests/flows/implicit_grant_spec.rb +0 -61
  252. data/spec/requests/flows/password_spec.rb +0 -115
  253. data/spec/requests/flows/refresh_token_spec.rb +0 -174
  254. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  255. data/spec/requests/flows/skip_authorization_spec.rb +0 -59
  256. data/spec/requests/protected_resources/metal_spec.rb +0 -14
  257. data/spec/requests/protected_resources/private_api_spec.rb +0 -81
  258. data/spec/routing/custom_controller_routes_spec.rb +0 -71
  259. data/spec/routing/default_routes_spec.rb +0 -35
  260. data/spec/routing/scoped_routes_spec.rb +0 -31
  261. data/spec/spec_helper.rb +0 -4
  262. data/spec/spec_helper_integration.rb +0 -63
  263. data/spec/support/dependencies/factory_girl.rb +0 -2
  264. data/spec/support/helpers/access_token_request_helper.rb +0 -11
  265. data/spec/support/helpers/authorization_request_helper.rb +0 -41
  266. data/spec/support/helpers/config_helper.rb +0 -9
  267. data/spec/support/helpers/model_helper.rb +0 -67
  268. data/spec/support/helpers/request_spec_helper.rb +0 -84
  269. data/spec/support/helpers/url_helper.rb +0 -55
  270. data/spec/support/http_method_shim.rb +0 -38
  271. data/spec/support/orm/active_record.rb +0 -3
  272. data/spec/support/shared/controllers_shared_context.rb +0 -69
  273. data/spec/support/shared/models_shared_examples.rb +0 -52
  274. data/spec/validators/redirect_uri_validator_spec.rb +0 -78
@@ -1,43 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/module/delegation'
3
- require 'active_support/core_ext/object/blank'
4
- require 'doorkeeper/oauth/scopes'
5
- require 'doorkeeper/models/concerns/scopes'
6
-
7
- describe 'Doorkeeper::Models::Scopes' do
8
- subject do
9
- Class.new(Hash) do
10
- include Doorkeeper::Models::Scopes
11
- end.new
12
- end
13
-
14
- before do
15
- subject[:scopes] = 'public admin'
16
- end
17
-
18
- describe :scopes do
19
- it 'is a `Scopes` class' do
20
- expect(subject.scopes).to be_a(Doorkeeper::OAuth::Scopes)
21
- end
22
-
23
- it 'includes scopes' do
24
- expect(subject.scopes).to include('public')
25
- end
26
- end
27
-
28
- describe :scopes_string do
29
- it 'is a `Scopes` class' do
30
- expect(subject.scopes_string).to eq('public admin')
31
- end
32
- end
33
-
34
- describe :includes_scope? do
35
- it 'should return true if at least one scope is included' do
36
- expect(subject.includes_scope?('public', 'private')).to be true
37
- end
38
-
39
- it 'should return false if no scopes are included' do
40
- expect(subject.includes_scope?('teacher', 'student')).to be false
41
- end
42
- end
43
- end
@@ -1,41 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/string'
3
- require 'uri'
4
- require 'rack/utils'
5
- require 'doorkeeper/oauth/authorization/uri_builder'
6
-
7
- module Doorkeeper::OAuth::Authorization
8
- describe URIBuilder do
9
- subject { URIBuilder }
10
-
11
- describe :uri_with_query do
12
- it 'returns the uri with query' do
13
- uri = subject.uri_with_query 'http://example.com/', parameter: 'value'
14
- expect(uri).to eq('http://example.com/?parameter=value')
15
- end
16
-
17
- it 'rejects nil values' do
18
- uri = subject.uri_with_query 'http://example.com/', parameter: ''
19
- expect(uri).to eq('http://example.com/?')
20
- end
21
-
22
- it 'preserves original query parameters' do
23
- uri = subject.uri_with_query 'http://example.com/?query1=value', parameter: 'value'
24
- expect(uri).to match(/query1=value/)
25
- expect(uri).to match(/parameter=value/)
26
- end
27
- end
28
-
29
- describe :uri_with_fragment do
30
- it 'returns uri with parameters as fragments' do
31
- uri = subject.uri_with_fragment 'http://example.com/', parameter: 'value'
32
- expect(uri).to eq('http://example.com/#parameter=value')
33
- end
34
-
35
- it 'preserves original query parameters' do
36
- uri = subject.uri_with_fragment 'http://example.com/?query1=value1', parameter: 'value'
37
- expect(uri).to eq('http://example.com/?query1=value1#parameter=value')
38
- end
39
- end
40
- end
41
- end
@@ -1,80 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe AuthorizationCodeRequest do
5
- let(:server) do
6
- double :server,
7
- access_token_expires_in: 2.days,
8
- refresh_token_enabled?: false,
9
- custom_access_token_expires_in: ->(_app) { nil }
10
- end
11
- let(:grant) { FactoryGirl.create :access_grant }
12
- let(:client) { grant.application }
13
-
14
- subject do
15
- AuthorizationCodeRequest.new server, grant, client, redirect_uri: client.redirect_uri
16
- end
17
-
18
- it 'issues a new token for the client' do
19
- expect do
20
- subject.authorize
21
- end.to change { client.reload.access_tokens.count }.by(1)
22
- end
23
-
24
- it "issues the token with same grant's scopes" do
25
- subject.authorize
26
- expect(Doorkeeper::AccessToken.last.scopes).to eq(grant.scopes)
27
- end
28
-
29
- it 'revokes the grant' do
30
- expect do
31
- subject.authorize
32
- end.to change { grant.reload.accessible? }
33
- end
34
-
35
- it 'requires the grant to be accessible' do
36
- grant.revoke
37
- subject.validate
38
- expect(subject.error).to eq(:invalid_grant)
39
- end
40
-
41
- it 'requires the grant' do
42
- subject.grant = nil
43
- subject.validate
44
- expect(subject.error).to eq(:invalid_grant)
45
- end
46
-
47
- it 'requires the client' do
48
- subject.client = nil
49
- subject.validate
50
- expect(subject.error).to eq(:invalid_client)
51
- end
52
-
53
- it 'requires the redirect_uri' do
54
- subject.redirect_uri = nil
55
- subject.validate
56
- expect(subject.error).to eq(:invalid_request)
57
- end
58
-
59
- it "matches the redirect_uri with grant's one" do
60
- subject.redirect_uri = 'http://other.com'
61
- subject.validate
62
- expect(subject.error).to eq(:invalid_grant)
63
- end
64
-
65
- it "matches the client with grant's one" do
66
- subject.client = FactoryGirl.create :application
67
- subject.validate
68
- expect(subject.error).to eq(:invalid_grant)
69
- end
70
-
71
- it 'skips token creation if there is a matching one' do
72
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
73
- FactoryGirl.create(:access_token, application_id: client.id,
74
- resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s)
75
- expect do
76
- subject.authorize
77
- end.to_not change { Doorkeeper::AccessToken.count }
78
- end
79
- end
80
- end
@@ -1,160 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe BaseRequest do
5
- let(:access_token) do
6
- double :access_token,
7
- token: "some-token",
8
- expires_in: "3600",
9
- expires_in_seconds: "300",
10
- scopes_string: "two scopes",
11
- refresh_token: "some-refresh-token",
12
- token_type: "bearer",
13
- created_at: 0
14
- end
15
-
16
- let(:client) do
17
- double :client,
18
- id: '1'
19
- end
20
-
21
- let(:scopes_array) do
22
- %w(public write)
23
- end
24
-
25
- let(:server) do
26
- double :server,
27
- access_token_expires_in: 100,
28
- custom_access_token_expires_in: ->(_) { nil },
29
- refresh_token_enabled?: false
30
- end
31
-
32
- subject do
33
- BaseRequest.new
34
- end
35
-
36
- describe "#authorize" do
37
- before do
38
- allow(subject).to receive(:access_token).and_return(access_token)
39
- end
40
-
41
- it "validates itself" do
42
- expect(subject).to receive(:validate).once
43
- subject.authorize
44
- end
45
-
46
- context "valid" do
47
- before do
48
- allow(subject).to receive(:valid?).and_return(true)
49
- end
50
-
51
- it "calls callback methods" do
52
- expect(subject).to receive(:before_successful_response).once
53
- expect(subject).to receive(:after_successful_response).once
54
- subject.authorize
55
- end
56
-
57
- it "returns a TokenResponse object" do
58
- result = subject.authorize
59
-
60
- expect(result).to be_an_instance_of(TokenResponse)
61
- expect(result.body).to eq(
62
- TokenResponse.new(access_token).body
63
- )
64
- end
65
- end
66
-
67
- context "invalid" do
68
- before do
69
- allow(subject).to receive(:valid?).and_return(false)
70
- allow(subject).to receive(:error).and_return("server_error")
71
- allow(subject).to receive(:state).and_return("hello")
72
- end
73
-
74
- it "returns an ErrorResponse object" do
75
- error_description = I18n.translate(
76
- "server_error",
77
- scope: [:doorkeeper, :errors, :messages]
78
- )
79
-
80
- result = subject.authorize
81
-
82
- expect(result).to be_an_instance_of(ErrorResponse)
83
-
84
- expect(result.body).to eq(
85
- error: "server_error",
86
- error_description: error_description,
87
- state: "hello"
88
- )
89
- end
90
- end
91
- end
92
-
93
- describe "#default_scopes" do
94
- it "delegates to the server" do
95
- expect(subject).to receive(:server).and_return(server).once
96
- expect(server).to receive(:default_scopes).once
97
-
98
- subject.default_scopes
99
- end
100
- end
101
-
102
- describe "#find_or_create_access_token" do
103
- it "returns an instance of AccessToken" do
104
- result = subject.find_or_create_access_token(
105
- client,
106
- "1",
107
- "public",
108
- server
109
- )
110
-
111
- expect(result).to be_an_instance_of(Doorkeeper::AccessToken)
112
- end
113
- end
114
-
115
- describe "#scopes" do
116
- context "@original_scopes is present" do
117
- before do
118
- subject.instance_variable_set(:@original_scopes, "public write")
119
- end
120
-
121
- it "returns array of @original_scopes" do
122
- result = subject.scopes
123
-
124
- expect(result).to eq(scopes_array)
125
- end
126
- end
127
-
128
- context "@original_scopes is not present" do
129
- before do
130
- subject.instance_variable_set(:@original_scopes, "")
131
- end
132
-
133
- it "calls #default_scopes" do
134
- allow(subject).to receive(:server).and_return(server).once
135
- allow(server).to receive(:default_scopes).and_return(scopes_array).once
136
-
137
- result = subject.scopes
138
-
139
- expect(result).to eq(scopes_array)
140
- end
141
- end
142
- end
143
-
144
- describe "#valid?" do
145
- context "error is nil" do
146
- it "returns true" do
147
- allow(subject).to receive(:error).and_return(nil).once
148
- expect(subject.valid?).to eq(true)
149
- end
150
- end
151
-
152
- context "error is not nil" do
153
- it "returns false" do
154
- allow(subject).to receive(:error).and_return(Object.new).once
155
- expect(subject.valid?).to eq(false)
156
- end
157
- end
158
- end
159
- end
160
- end
@@ -1,45 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe BaseResponse do
5
- subject do
6
- BaseResponse.new
7
- end
8
-
9
- describe "#body" do
10
- it "returns an empty Hash" do
11
- expect(subject.body).to eq({})
12
- end
13
- end
14
-
15
- describe "#description" do
16
- it "returns an empty String" do
17
- expect(subject.description).to eq("")
18
- end
19
- end
20
-
21
- describe "#headers" do
22
- it "returns an empty Hash" do
23
- expect(subject.headers).to eq({})
24
- end
25
- end
26
-
27
- describe "#redirectable?" do
28
- it "returns false" do
29
- expect(subject.redirectable?).to eq(false)
30
- end
31
- end
32
-
33
- describe "#redirect_uri" do
34
- it "returns an empty String" do
35
- expect(subject.redirect_uri).to eq("")
36
- end
37
- end
38
-
39
- describe "#status" do
40
- it "returns :ok" do
41
- expect(subject.status).to eq(:ok)
42
- end
43
- end
44
- end
45
- end
@@ -1,88 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/string'
3
- require 'doorkeeper/oauth/client'
4
-
5
- class Doorkeeper::OAuth::Client
6
- describe Credentials do
7
- let(:client_id) { 'some-uid' }
8
- let(:client_secret) { 'some-secret' }
9
-
10
- it 'is blank when any of the credentials is blank' do
11
- expect(Credentials.new(nil, 'something')).to be_blank
12
- expect(Credentials.new('something', nil)).to be_blank
13
- end
14
-
15
- describe :from_request do
16
- let(:request) { double.as_null_object }
17
-
18
- let(:method) do
19
- ->(_request) { return 'uid', 'secret' }
20
- end
21
-
22
- it 'accepts anything that responds to #call' do
23
- expect(method).to receive(:call).with(request)
24
- Credentials.from_request request, method
25
- end
26
-
27
- it 'delegates methods received as symbols to Credentials class' do
28
- expect(Credentials).to receive(:from_params).with(request)
29
- Credentials.from_request request, :from_params
30
- end
31
-
32
- it 'stops at the first credentials found' do
33
- not_called_method = double
34
- expect(not_called_method).not_to receive(:call)
35
- Credentials.from_request request, ->(_) {}, method, not_called_method
36
- end
37
-
38
- it 'returns new Credentials' do
39
- credentials = Credentials.from_request request, method
40
- expect(credentials).to be_a(Credentials)
41
- end
42
-
43
- it 'returns uid and secret from extractor method' do
44
- credentials = Credentials.from_request request, method
45
- expect(credentials.uid).to eq('uid')
46
- expect(credentials.secret).to eq('secret')
47
- end
48
- end
49
-
50
- describe :from_params do
51
- it 'returns credentials from parameters when Authorization header is not available' do
52
- request = double parameters: { client_id: client_id, client_secret: client_secret }
53
- uid, secret = Credentials.from_params(request)
54
-
55
- expect(uid).to eq('some-uid')
56
- expect(secret).to eq('some-secret')
57
- end
58
-
59
- it 'is blank when there are no credentials' do
60
- request = double parameters: {}
61
- uid, secret = Credentials.from_params(request)
62
-
63
- expect(uid).to be_blank
64
- expect(secret).to be_blank
65
- end
66
- end
67
-
68
- describe :from_basic do
69
- let(:credentials) { Base64.encode64("#{client_id}:#{client_secret}") }
70
-
71
- it 'decodes the credentials' do
72
- request = double authorization: "Basic #{credentials}"
73
- uid, secret = Credentials.from_basic(request)
74
-
75
- expect(uid).to eq('some-uid')
76
- expect(secret).to eq('some-secret')
77
- end
78
-
79
- it 'is blank if Authorization is not Basic' do
80
- request = double authorization: "#{credentials}"
81
- uid, secret = Credentials.from_basic(request)
82
-
83
- expect(uid).to be_blank
84
- expect(secret).to be_blank
85
- end
86
- end
87
- end
88
- end
@@ -1,44 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- class Doorkeeper::OAuth::ClientCredentialsRequest
4
- describe Creator do
5
- let(:client) { FactoryGirl.create :application }
6
- let(:scopes) { Doorkeeper::OAuth::Scopes.from_string('public') }
7
-
8
- it 'creates a new token' do
9
- expect do
10
- subject.call(client, scopes)
11
- end.to change { Doorkeeper::AccessToken.count }.by(1)
12
- end
13
-
14
- context "when reuse_access_token is true" do
15
- it "returns the existing valid token" do
16
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
17
- existing_token = subject.call(client, scopes)
18
-
19
- result = subject.call(client, scopes)
20
-
21
- expect(Doorkeeper::AccessToken.count).to eq(1)
22
- expect(result).to eq(existing_token)
23
- end
24
- end
25
-
26
- context "when reuse_access_token is false" do
27
- it "returns a new token" do
28
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(false)
29
- existing_token = subject.call(client, scopes)
30
-
31
- result = subject.call(client, scopes)
32
-
33
- expect(Doorkeeper::AccessToken.count).to eq(2)
34
- expect(result).not_to eq(existing_token)
35
- end
36
- end
37
-
38
- it 'returns false if creation fails' do
39
- expect(Doorkeeper::AccessToken).to receive(:find_or_create_for).and_return(false)
40
- created = subject.call(client, scopes)
41
- expect(created).to be_falsey
42
- end
43
- end
44
- end
@@ -1,86 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/all'
3
- require 'doorkeeper/oauth/client_credentials/issuer'
4
-
5
- class Doorkeeper::OAuth::ClientCredentialsRequest
6
- describe Issuer do
7
- let(:creator) { double :acces_token_creator }
8
- let(:server) do
9
- double(
10
- :server,
11
- access_token_expires_in: 100,
12
- custom_access_token_expires_in: ->(_app) { nil }
13
- )
14
- end
15
- let(:validation) { double :validation, valid?: true }
16
-
17
- subject { Issuer.new(server, validation) }
18
-
19
- describe :create do
20
- let(:client) { double :client, id: 'some-id' }
21
- let(:scopes) { 'some scope' }
22
-
23
- it 'creates and sets the token' do
24
- expect(creator).to receive(:call).and_return('token')
25
- subject.create client, scopes, creator
26
-
27
- expect(subject.token).to eq('token')
28
- end
29
-
30
- it 'creates with correct token parameters' do
31
- expect(creator).to receive(:call).with(
32
- client,
33
- scopes,
34
- expires_in: 100,
35
- use_refresh_token: false
36
- )
37
-
38
- subject.create client, scopes, creator
39
- end
40
-
41
- it 'has error set to :server_error if creator fails' do
42
- expect(creator).to receive(:call).and_return(false)
43
- subject.create client, scopes, creator
44
-
45
- expect(subject.error).to eq(:server_error)
46
- end
47
-
48
- context 'when validation fails' do
49
- before do
50
- allow(validation).to receive(:valid?).and_return(false)
51
- allow(validation).to receive(:error).and_return(:validation_error)
52
- expect(creator).not_to receive(:create)
53
- end
54
-
55
- it 'has error set from validation' do
56
- subject.create client, scopes, creator
57
- expect(subject.error).to eq(:validation_error)
58
- end
59
-
60
- it 'returns false' do
61
- expect(subject.create(client, scopes, creator)).to be_falsey
62
- end
63
- end
64
-
65
- context 'with custom expirations' do
66
- let(:custom_ttl) { 1233 }
67
- let(:server) do
68
- double(
69
- :server,
70
- custom_access_token_expires_in: ->(_app) { custom_ttl }
71
- )
72
- end
73
-
74
- it 'creates with correct token parameters' do
75
- expect(creator).to receive(:call).with(
76
- client,
77
- scopes,
78
- expires_in: custom_ttl,
79
- use_refresh_token: false
80
- )
81
- subject.create client, scopes, creator
82
- end
83
- end
84
- end
85
- end
86
- end
@@ -1,54 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/all'
3
- require 'doorkeeper/oauth/client_credentials/validation'
4
-
5
- class Doorkeeper::OAuth::ClientCredentialsRequest
6
- describe Validation do
7
- let(:server) { double :server, scopes: nil }
8
- let(:application) { double scopes: nil }
9
- let(:client) { double application: application }
10
- let(:request) { double :request, client: client, scopes: nil }
11
-
12
- subject { Validation.new(server, request) }
13
-
14
- it 'is valid with valid request' do
15
- expect(subject).to be_valid
16
- end
17
-
18
- it 'is invalid when client is not present' do
19
- allow(request).to receive(:client).and_return(nil)
20
- expect(subject).not_to be_valid
21
- end
22
-
23
- context 'with scopes' do
24
- it 'is invalid when scopes are not included in the server' do
25
- server_scopes = Doorkeeper::OAuth::Scopes.from_string 'email'
26
- allow(server).to receive(:scopes).and_return(server_scopes)
27
- allow(request).to receive(:scopes).and_return(
28
- Doorkeeper::OAuth::Scopes.from_string 'invalid')
29
- expect(subject).not_to be_valid
30
- end
31
-
32
- context 'with application scopes' do
33
- it 'is valid when scopes are included in the application' do
34
- application_scopes = Doorkeeper::OAuth::Scopes.from_string 'app'
35
- server_scopes = Doorkeeper::OAuth::Scopes.from_string 'email app'
36
- allow(application).to receive(:scopes).and_return(application_scopes)
37
- allow(server).to receive(:scopes).and_return(server_scopes)
38
- allow(request).to receive(:scopes).and_return(application_scopes)
39
- expect(subject).to be_valid
40
- end
41
-
42
- it 'is invalid when scopes are not included in the application' do
43
- application_scopes = Doorkeeper::OAuth::Scopes.from_string 'app'
44
- server_scopes = Doorkeeper::OAuth::Scopes.from_string 'email app'
45
- allow(application).to receive(:scopes).and_return(application_scopes)
46
- allow(server).to receive(:scopes).and_return(server_scopes)
47
- allow(request).to receive(:scopes).and_return(
48
- Doorkeeper::OAuth::Scopes.from_string 'email')
49
- expect(subject).not_to be_valid
50
- end
51
- end
52
- end
53
- end
54
- end
@@ -1,27 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe ClientCredentialsRequest do
5
- let(:server) { Doorkeeper.configuration }
6
-
7
- context 'with a valid request' do
8
- let(:client) { FactoryGirl.create :application }
9
-
10
- it 'issues an access token' do
11
- request = ClientCredentialsRequest.new(server, client, {})
12
- expect do
13
- request.authorize
14
- end.to change { Doorkeeper::AccessToken.count }.by(1)
15
- end
16
- end
17
-
18
- describe 'with an invalid request' do
19
- it 'does not issue an access token' do
20
- request = ClientCredentialsRequest.new(server, nil, {})
21
- expect do
22
- request.authorize
23
- end.to_not change { Doorkeeper::AccessToken.count }
24
- end
25
- end
26
- end
27
- end