doorkeeper 4.2.0 → 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 (271) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1038 -0
  3. data/README.md +110 -348
  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 -20
  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 +112 -35
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +10 -6
  13. data/app/views/doorkeeper/applications/_delete_form.html.erb +4 -3
  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 +7 -1
  22. data/app/views/doorkeeper/authorized_applications/_delete_form.html.erb +1 -2
  23. data/app/views/doorkeeper/authorized_applications/index.html.erb +0 -1
  24. data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
  25. data/config/locales/en.yml +33 -9
  26. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  27. data/lib/doorkeeper/config/option.rb +82 -0
  28. data/lib/doorkeeper/config/validations.rb +53 -0
  29. data/lib/doorkeeper/config.rb +545 -143
  30. data/lib/doorkeeper/engine.rb +11 -5
  31. data/lib/doorkeeper/errors.rb +37 -10
  32. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  33. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  34. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  35. data/lib/doorkeeper/grant_flow.rb +45 -0
  36. data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
  37. data/lib/doorkeeper/grape/helpers.rb +24 -12
  38. data/lib/doorkeeper/helpers/controller.rb +49 -27
  39. data/lib/doorkeeper/models/access_grant_mixin.rb +100 -21
  40. data/lib/doorkeeper/models/access_token_mixin.rb +379 -75
  41. data/lib/doorkeeper/models/application_mixin.rb +72 -25
  42. data/lib/doorkeeper/models/concerns/accessible.rb +6 -0
  43. data/lib/doorkeeper/models/concerns/expirable.rb +20 -6
  44. data/lib/doorkeeper/models/concerns/orderable.rb +15 -0
  45. data/lib/doorkeeper/models/concerns/ownership.rb +4 -7
  46. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  47. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  48. data/lib/doorkeeper/models/concerns/revocable.rb +12 -18
  49. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  50. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  51. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  52. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  53. data/lib/doorkeeper/oauth/authorization/token.rb +66 -28
  54. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
  55. data/lib/doorkeeper/oauth/authorization_code_request.rb +64 -14
  56. data/lib/doorkeeper/oauth/base_request.rb +66 -0
  57. data/lib/doorkeeper/oauth/base_response.rb +31 -0
  58. data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
  59. data/lib/doorkeeper/oauth/client.rb +10 -12
  60. data/lib/doorkeeper/oauth/client_credentials/creator.rb +47 -4
  61. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +16 -9
  62. data/lib/doorkeeper/oauth/client_credentials/validator.rb +56 -0
  63. data/lib/doorkeeper/oauth/client_credentials_request.rb +11 -15
  64. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  65. data/lib/doorkeeper/oauth/code_response.rb +28 -15
  66. data/lib/doorkeeper/oauth/error.rb +5 -3
  67. data/lib/doorkeeper/oauth/error_response.rb +41 -20
  68. data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
  69. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -18
  70. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  71. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +53 -3
  72. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  73. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  74. data/lib/doorkeeper/oauth/invalid_token_response.rb +31 -5
  75. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  76. data/lib/doorkeeper/oauth/password_access_token_request.rb +45 -13
  77. data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
  78. data/lib/doorkeeper/oauth/refresh_token_request.rb +61 -36
  79. data/lib/doorkeeper/oauth/scopes.rb +26 -12
  80. data/lib/doorkeeper/oauth/token.rb +25 -23
  81. data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
  82. data/lib/doorkeeper/oauth/token_request.rb +8 -21
  83. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  84. data/lib/doorkeeper/oauth.rb +13 -0
  85. data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
  86. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -25
  87. data/lib/doorkeeper/orm/active_record/application.rb +6 -15
  88. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
  89. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
  90. data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
  91. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  92. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  93. data/lib/doorkeeper/orm/active_record.rb +37 -8
  94. data/lib/doorkeeper/rails/helpers.rb +14 -15
  95. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  96. data/lib/doorkeeper/rails/routes/mapper.rb +3 -1
  97. data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
  98. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  99. data/lib/doorkeeper/rails/routes.rb +42 -30
  100. data/lib/doorkeeper/rake/db.rake +40 -0
  101. data/lib/doorkeeper/rake/setup.rake +11 -0
  102. data/lib/doorkeeper/rake.rb +14 -0
  103. data/lib/doorkeeper/request/authorization_code.rb +12 -4
  104. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  105. data/lib/doorkeeper/request/code.rb +1 -1
  106. data/lib/doorkeeper/request/password.rb +5 -14
  107. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  108. data/lib/doorkeeper/request/strategy.rb +4 -2
  109. data/lib/doorkeeper/request/token.rb +1 -1
  110. data/lib/doorkeeper/request.rb +62 -29
  111. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  112. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  113. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  114. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  115. data/lib/doorkeeper/server.rb +9 -19
  116. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  117. data/lib/doorkeeper/validations.rb +5 -2
  118. data/lib/doorkeeper/version.rb +12 -1
  119. data/lib/doorkeeper.rb +111 -56
  120. data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
  121. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  122. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  123. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  124. data/lib/generators/doorkeeper/migration_generator.rb +27 -10
  125. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  126. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +31 -19
  127. data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
  128. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
  129. data/lib/generators/doorkeeper/templates/{add_previous_refresh_token_to_access_tokens.rb → add_previous_refresh_token_to_access_tokens.rb.erb} +3 -1
  130. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  131. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  132. data/lib/generators/doorkeeper/templates/initializer.rb +410 -31
  133. data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
  134. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  135. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  136. metadata +132 -286
  137. data/.gitignore +0 -14
  138. data/.hound.yml +0 -13
  139. data/.rspec +0 -1
  140. data/.travis.yml +0 -20
  141. data/CONTRIBUTING.md +0 -47
  142. data/Gemfile +0 -14
  143. data/NEWS.md +0 -593
  144. data/RELEASING.md +0 -17
  145. data/Rakefile +0 -20
  146. data/app/validators/redirect_uri_validator.rb +0 -34
  147. data/doorkeeper.gemspec +0 -28
  148. data/lib/doorkeeper/oauth/client/methods.rb +0 -18
  149. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  150. data/lib/doorkeeper/oauth/request_concern.rb +0 -48
  151. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
  152. data/lib/generators/doorkeeper/templates/migration.rb +0 -68
  153. data/spec/controllers/application_metal_controller.rb +0 -10
  154. data/spec/controllers/applications_controller_spec.rb +0 -58
  155. data/spec/controllers/authorizations_controller_spec.rb +0 -189
  156. data/spec/controllers/protected_resources_controller_spec.rb +0 -300
  157. data/spec/controllers/token_info_controller_spec.rb +0 -52
  158. data/spec/controllers/tokens_controller_spec.rb +0 -88
  159. data/spec/dummy/Rakefile +0 -7
  160. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  161. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  162. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  163. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  164. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  165. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  166. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  167. data/spec/dummy/app/models/user.rb +0 -5
  168. data/spec/dummy/app/views/home/index.html.erb +0 -0
  169. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  170. data/spec/dummy/config/application.rb +0 -23
  171. data/spec/dummy/config/boot.rb +0 -9
  172. data/spec/dummy/config/database.yml +0 -15
  173. data/spec/dummy/config/environment.rb +0 -5
  174. data/spec/dummy/config/environments/development.rb +0 -29
  175. data/spec/dummy/config/environments/production.rb +0 -62
  176. data/spec/dummy/config/environments/test.rb +0 -44
  177. data/spec/dummy/config/initializers/active_record_belongs_to_required_by_default.rb +0 -6
  178. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  179. data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
  180. data/spec/dummy/config/initializers/secret_token.rb +0 -9
  181. data/spec/dummy/config/initializers/session_store.rb +0 -8
  182. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  183. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  184. data/spec/dummy/config/routes.rb +0 -52
  185. data/spec/dummy/config.ru +0 -4
  186. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
  187. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
  188. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -60
  189. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -7
  190. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -11
  191. data/spec/dummy/db/schema.rb +0 -67
  192. data/spec/dummy/public/404.html +0 -26
  193. data/spec/dummy/public/422.html +0 -26
  194. data/spec/dummy/public/500.html +0 -26
  195. data/spec/dummy/public/favicon.ico +0 -0
  196. data/spec/dummy/script/rails +0 -6
  197. data/spec/factories.rb +0 -28
  198. data/spec/generators/application_owner_generator_spec.rb +0 -22
  199. data/spec/generators/install_generator_spec.rb +0 -31
  200. data/spec/generators/migration_generator_spec.rb +0 -20
  201. data/spec/generators/templates/routes.rb +0 -3
  202. data/spec/generators/views_generator_spec.rb +0 -27
  203. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  204. data/spec/lib/config_spec.rb +0 -334
  205. data/spec/lib/doorkeeper_spec.rb +0 -28
  206. data/spec/lib/models/expirable_spec.rb +0 -51
  207. data/spec/lib/models/revocable_spec.rb +0 -59
  208. data/spec/lib/models/scopes_spec.rb +0 -43
  209. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -42
  210. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
  211. data/spec/lib/oauth/client/credentials_spec.rb +0 -47
  212. data/spec/lib/oauth/client/methods_spec.rb +0 -54
  213. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  214. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  215. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  216. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  217. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
  218. data/spec/lib/oauth/client_spec.rb +0 -39
  219. data/spec/lib/oauth/code_request_spec.rb +0 -45
  220. data/spec/lib/oauth/code_response_spec.rb +0 -34
  221. data/spec/lib/oauth/error_response_spec.rb +0 -61
  222. data/spec/lib/oauth/error_spec.rb +0 -23
  223. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
  224. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
  225. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
  226. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -104
  227. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -28
  228. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -90
  229. data/spec/lib/oauth/pre_authorization_spec.rb +0 -155
  230. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -154
  231. data/spec/lib/oauth/scopes_spec.rb +0 -122
  232. data/spec/lib/oauth/token_request_spec.rb +0 -98
  233. data/spec/lib/oauth/token_response_spec.rb +0 -85
  234. data/spec/lib/oauth/token_spec.rb +0 -116
  235. data/spec/lib/request/strategy_spec.rb +0 -53
  236. data/spec/lib/server_spec.rb +0 -52
  237. data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
  238. data/spec/models/doorkeeper/access_token_spec.rb +0 -394
  239. data/spec/models/doorkeeper/application_spec.rb +0 -179
  240. data/spec/requests/applications/applications_request_spec.rb +0 -94
  241. data/spec/requests/applications/authorized_applications_spec.rb +0 -30
  242. data/spec/requests/endpoints/authorization_spec.rb +0 -72
  243. data/spec/requests/endpoints/token_spec.rb +0 -64
  244. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -66
  245. data/spec/requests/flows/authorization_code_spec.rb +0 -156
  246. data/spec/requests/flows/client_credentials_spec.rb +0 -58
  247. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
  248. data/spec/requests/flows/implicit_grant_spec.rb +0 -61
  249. data/spec/requests/flows/password_spec.rb +0 -115
  250. data/spec/requests/flows/refresh_token_spec.rb +0 -174
  251. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  252. data/spec/requests/flows/skip_authorization_spec.rb +0 -59
  253. data/spec/requests/protected_resources/metal_spec.rb +0 -14
  254. data/spec/requests/protected_resources/private_api_spec.rb +0 -81
  255. data/spec/routing/custom_controller_routes_spec.rb +0 -71
  256. data/spec/routing/default_routes_spec.rb +0 -35
  257. data/spec/routing/scoped_routes_spec.rb +0 -31
  258. data/spec/spec_helper.rb +0 -2
  259. data/spec/spec_helper_integration.rb +0 -59
  260. data/spec/support/dependencies/factory_girl.rb +0 -2
  261. data/spec/support/helpers/access_token_request_helper.rb +0 -11
  262. data/spec/support/helpers/authorization_request_helper.rb +0 -41
  263. data/spec/support/helpers/config_helper.rb +0 -9
  264. data/spec/support/helpers/model_helper.rb +0 -67
  265. data/spec/support/helpers/request_spec_helper.rb +0 -76
  266. data/spec/support/helpers/url_helper.rb +0 -55
  267. data/spec/support/http_method_shim.rb +0 -24
  268. data/spec/support/orm/active_record.rb +0 -3
  269. data/spec/support/shared/controllers_shared_context.rb +0 -69
  270. data/spec/support/shared/models_shared_examples.rb +0 -52
  271. data/spec/validators/redirect_uri_validator_spec.rb +0 -78
@@ -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,47 +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
- it 'is blank when any of the credentials is blank' do
8
- expect(Credentials.new(nil, 'something')).to be_blank
9
- expect(Credentials.new('something', nil)).to be_blank
10
- end
11
-
12
- describe :from_request do
13
- let(:request) { double.as_null_object }
14
-
15
- let(:method) do
16
- ->(_request) { return 'uid', 'secret' }
17
- end
18
-
19
- it 'accepts anything that responds to #call' do
20
- expect(method).to receive(:call).with(request)
21
- Credentials.from_request request, method
22
- end
23
-
24
- it 'delegates methods received as symbols to Credentials class' do
25
- expect(Credentials).to receive(:from_params).with(request)
26
- Credentials.from_request request, :from_params
27
- end
28
-
29
- it 'stops at the first credentials found' do
30
- not_called_method = double
31
- expect(not_called_method).not_to receive(:call)
32
- Credentials.from_request request, ->(_) {}, method, not_called_method
33
- end
34
-
35
- it 'returns new Credentials' do
36
- credentials = Credentials.from_request request, method
37
- expect(credentials).to be_a(Credentials)
38
- end
39
-
40
- it 'returns uid and secret from extractor method' do
41
- credentials = Credentials.from_request request, method
42
- expect(credentials.uid).to eq('uid')
43
- expect(credentials.secret).to eq('secret')
44
- end
45
- end
46
- end
47
- end
@@ -1,54 +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 'Methods' do
7
- let(:client_id) { 'some-uid' }
8
- let(:client_secret) { 'some-secret' }
9
-
10
- subject do
11
- Class.new do
12
- include Methods
13
- end.new
14
- end
15
-
16
- describe :from_params do
17
- it 'returns credentials from parameters when Authorization header is not available' do
18
- request = double parameters: { client_id: client_id, client_secret: client_secret }
19
- uid, secret = subject.from_params(request)
20
-
21
- expect(uid).to eq('some-uid')
22
- expect(secret).to eq('some-secret')
23
- end
24
-
25
- it 'is blank when there are no credentials' do
26
- request = double parameters: {}
27
- uid, secret = subject.from_params(request)
28
-
29
- expect(uid).to be_blank
30
- expect(secret).to be_blank
31
- end
32
- end
33
-
34
- describe :from_basic do
35
- let(:credentials) { Base64.encode64("#{client_id}:#{client_secret}") }
36
-
37
- it 'decodes the credentials' do
38
- request = double authorization: "Basic #{credentials}"
39
- uid, secret = subject.from_basic(request)
40
-
41
- expect(uid).to eq('some-uid')
42
- expect(secret).to eq('some-secret')
43
- end
44
-
45
- it 'is blank if Authorization is not Basic' do
46
- request = double authorization: "#{credentials}"
47
- uid, secret = subject.from_basic(request)
48
-
49
- expect(uid).to be_blank
50
- expect(secret).to be_blank
51
- end
52
- end
53
- end
54
- 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
@@ -1,104 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/all'
3
- require 'active_model'
4
- require 'doorkeeper/oauth/client_credentials_request'
5
-
6
- module Doorkeeper::OAuth
7
- describe ClientCredentialsRequest do
8
- let(:server) do
9
- double(
10
- default_scopes: nil,
11
- custom_access_token_expires_in: ->(_app) { nil }
12
- )
13
- end
14
- let(:application) { double :application, scopes: Scopes.from_string('') }
15
- let(:client) { double :client, application: application }
16
- let(:token_creator) { double :issuer, create: true, token: double }
17
-
18
- subject { ClientCredentialsRequest.new(server, client) }
19
-
20
- before do
21
- subject.issuer = token_creator
22
- end
23
-
24
- it 'issues an access token for the current client' do
25
- expect(token_creator).to receive(:create).with(client, nil)
26
- subject.authorize
27
- end
28
-
29
- it 'has successful response when issue was created' do
30
- subject.authorize
31
- expect(subject.response).to be_a(TokenResponse)
32
- end
33
-
34
- context 'if issue was not created' do
35
- before do
36
- subject.issuer = double create: false, error: :invalid
37
- end
38
-
39
- it 'has an error response' do
40
- subject.authorize
41
- expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
42
- end
43
-
44
- it 'delegates the error to issuer' do
45
- subject.authorize
46
- expect(subject.error).to eq(:invalid)
47
- end
48
- end
49
-
50
- context 'with scopes' do
51
- let(:default_scopes) { Doorkeeper::OAuth::Scopes.from_string('public email') }
52
-
53
- before do
54
- allow(server).to receive(:default_scopes).and_return(default_scopes)
55
- end
56
-
57
- it 'issues an access token with default scopes if none was requested' do
58
- expect(token_creator).to receive(:create).with(client, default_scopes)
59
- subject.authorize
60
- end
61
-
62
- it 'issues an access token with requested scopes' do
63
- subject = ClientCredentialsRequest.new(server, client, scope: 'email')
64
- subject.issuer = token_creator
65
- expect(token_creator).to receive(:create).with(client, Doorkeeper::OAuth::Scopes.from_string('email'))
66
- subject.authorize
67
- end
68
- end
69
-
70
- context 'with restricted client' do
71
- let(:default_scopes) do
72
- Doorkeeper::OAuth::Scopes.from_string('public email')
73
- end
74
- let(:server_scopes) do
75
- Doorkeeper::OAuth::Scopes.from_string('public email phone')
76
- end
77
- let(:client_scopes) do
78
- Doorkeeper::OAuth::Scopes.from_string('public phone')
79
- end
80
-
81
- before do
82
- allow(server).to receive(:default_scopes).and_return(default_scopes)
83
- allow(server).to receive(:scopes).and_return(server_scopes)
84
- allow(server).to receive(:access_token_expires_in).and_return(100)
85
- allow(application).to receive(:scopes).and_return(client_scopes)
86
- allow(client).to receive(:id).and_return(nil)
87
- end
88
-
89
- it 'delegates the error to issuer if no scope was requested' do
90
- subject = ClientCredentialsRequest.new(server, client)
91
- subject.authorize
92
- expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
93
- expect(subject.error).to eq(:invalid_scope)
94
- end
95
-
96
- it 'issues an access token with requested scopes' do
97
- subject = ClientCredentialsRequest.new(server, client, scope: 'phone')
98
- subject.authorize
99
- expect(subject.response).to be_a(Doorkeeper::OAuth::TokenResponse)
100
- expect(subject.response.token.scopes_string).to eq('phone')
101
- end
102
- end
103
- end
104
- end
@@ -1,39 +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/client'
5
-
6
- module Doorkeeper::OAuth
7
- describe Client do
8
- describe :find do
9
- let(:method) { double }
10
-
11
- it 'finds the client via uid' do
12
- client = double
13
- expect(method).to receive(:call).with('uid').and_return(client)
14
- expect(Client.find('uid', method)).to be_a(Client)
15
- end
16
-
17
- it 'returns nil if client was not found' do
18
- expect(method).to receive(:call).with('uid').and_return(nil)
19
- expect(Client.find('uid', method)).to be_nil
20
- end
21
- end
22
-
23
- describe :authenticate do
24
- it 'returns the authenticated client via credentials' do
25
- credentials = Client::Credentials.new('some-uid', 'some-secret')
26
- authenticator = double
27
- expect(authenticator).to receive(:call).with('some-uid', 'some-secret').and_return(double)
28
- expect(Client.authenticate(credentials, authenticator)).to be_a(Client)
29
- end
30
-
31
- it 'returns nil if client was not authenticated' do
32
- credentials = Client::Credentials.new('some-uid', 'some-secret')
33
- authenticator = double
34
- expect(authenticator).to receive(:call).with('some-uid', 'some-secret').and_return(nil)
35
- expect(Client.authenticate(credentials, authenticator)).to be_nil
36
- end
37
- end
38
- end
39
- end
@@ -1,45 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe CodeRequest do
5
- let(:pre_auth) do
6
- double(
7
- :pre_auth,
8
- client: double(:application, id: 9990),
9
- redirect_uri: 'http://tst.com/cb',
10
- scopes: nil,
11
- state: nil,
12
- error: nil,
13
- authorizable?: true
14
- )
15
- end
16
-
17
- let(:owner) { double :owner, id: 8900 }
18
-
19
- subject do
20
- CodeRequest.new(pre_auth, owner)
21
- end
22
-
23
- it 'creates an access grant' do
24
- expect do
25
- subject.authorize
26
- end.to change { Doorkeeper::AccessGrant.count }.by(1)
27
- end
28
-
29
- it 'returns a code response' do
30
- expect(subject.authorize).to be_a(CodeResponse)
31
- end
32
-
33
- it 'does not create grant when not authorizable' do
34
- allow(pre_auth).to receive(:authorizable?).and_return(false)
35
- expect do
36
- subject.authorize
37
- end.to_not change { Doorkeeper::AccessGrant.count }
38
- end
39
-
40
- it 'returns a error response' do
41
- allow(pre_auth).to receive(:authorizable?).and_return(false)
42
- expect(subject.authorize).to be_a(ErrorResponse)
43
- end
44
- end
45
- end
@@ -1,34 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Doorkeeper
4
- module OAuth
5
- describe CodeResponse do
6
- describe '.redirect_uri' do
7
- context 'when generating the redirect URI for an implicit grant' do
8
- let :pre_auth do
9
- double(
10
- :pre_auth,
11
- client: double(:application, id: 1),
12
- redirect_uri: 'http://tst.com/cb',
13
- state: nil,
14
- scopes: Scopes.from_string('public'),
15
- )
16
- end
17
-
18
- let :auth do
19
- Authorization::Token.new(pre_auth, double(id: 1)).tap do |c|
20
- c.issue_token
21
- allow(c.token).to receive(:expires_in_seconds).and_return(3600)
22
- end
23
- end
24
-
25
- subject { CodeResponse.new(pre_auth, auth, response_on_fragment: true).redirect_uri }
26
-
27
- it 'includes the remaining TTL of the token relative to the time the token was generated' do
28
- expect(subject).to include('expires_in=3600')
29
- end
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,61 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_model'
3
- require 'doorkeeper/oauth/error'
4
- require 'doorkeeper/oauth/error_response'
5
-
6
- module Doorkeeper::OAuth
7
- describe ErrorResponse do
8
- describe '#status' do
9
- it 'should have a status of unauthorized' do
10
- expect(subject.status).to eq(:unauthorized)
11
- end
12
- end
13
-
14
- describe :from_request do
15
- it 'has the error from request' do
16
- error = ErrorResponse.from_request double(error: :some_error)
17
- expect(error.name).to eq(:some_error)
18
- end
19
-
20
- it 'ignores state if request does not respond to state' do
21
- error = ErrorResponse.from_request double(error: :some_error)
22
- expect(error.state).to be_nil
23
- end
24
-
25
- it 'has state if request responds to state' do
26
- error = ErrorResponse.from_request double(error: :some_error, state: :hello)
27
- expect(error.state).to eq(:hello)
28
- end
29
- end
30
-
31
- it 'ignores empty error values' do
32
- subject = ErrorResponse.new(error: :some_error, state: nil)
33
- expect(subject.body).not_to have_key(:state)
34
- end
35
-
36
- describe '.body' do
37
- subject { ErrorResponse.new(name: :some_error, state: :some_state).body }
38
-
39
- describe '#body' do
40
- it { expect(subject).to have_key(:error) }
41
- it { expect(subject).to have_key(:error_description) }
42
- it { expect(subject).to have_key(:state) }
43
- end
44
- end
45
-
46
- describe '.authenticate_info' do
47
- let(:error_response) { ErrorResponse.new(name: :some_error, state: :some_state) }
48
- subject { error_response.authenticate_info }
49
-
50
- it { expect(subject).to include("realm=\"#{error_response.realm}\"") }
51
- it { expect(subject).to include("error=\"#{error_response.name}\"") }
52
- it { expect(subject).to include("error_description=\"#{error_response.description}\"") }
53
- end
54
-
55
- describe '.headers' do
56
- subject { ErrorResponse.new(name: :some_error, state: :some_state).headers }
57
-
58
- it { expect(subject).to include 'WWW-Authenticate' }
59
- end
60
- end
61
- end