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,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) { FactoryBot.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,105 +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
-
15
- let(:application) { double :application, scopes: Scopes.from_string('') }
16
- let(:client) { double :client, application: application }
17
- let(:token_creator) { double :issuer, create: true, token: double }
18
-
19
- subject { ClientCredentialsRequest.new(server, client) }
20
-
21
- before do
22
- subject.issuer = token_creator
23
- end
24
-
25
- it 'issues an access token for the current client' do
26
- expect(token_creator).to receive(:create).with(client, nil)
27
- subject.authorize
28
- end
29
-
30
- it 'has successful response when issue was created' do
31
- subject.authorize
32
- expect(subject.response).to be_a(TokenResponse)
33
- end
34
-
35
- context 'if issue was not created' do
36
- before do
37
- subject.issuer = double create: false, error: :invalid
38
- end
39
-
40
- it 'has an error response' do
41
- subject.authorize
42
- expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
43
- end
44
-
45
- it 'delegates the error to issuer' do
46
- subject.authorize
47
- expect(subject.error).to eq(:invalid)
48
- end
49
- end
50
-
51
- context 'with scopes' do
52
- let(:default_scopes) { Doorkeeper::OAuth::Scopes.from_string('public email') }
53
-
54
- before do
55
- allow(server).to receive(:default_scopes).and_return(default_scopes)
56
- end
57
-
58
- it 'issues an access token with default scopes if none was requested' do
59
- expect(token_creator).to receive(:create).with(client, default_scopes)
60
- subject.authorize
61
- end
62
-
63
- it 'issues an access token with requested scopes' do
64
- subject = ClientCredentialsRequest.new(server, client, scope: 'email')
65
- subject.issuer = token_creator
66
- expect(token_creator).to receive(:create).with(client, Doorkeeper::OAuth::Scopes.from_string('email'))
67
- subject.authorize
68
- end
69
- end
70
-
71
- context 'with restricted client' do
72
- let(:default_scopes) do
73
- Doorkeeper::OAuth::Scopes.from_string('public email')
74
- end
75
- let(:server_scopes) do
76
- Doorkeeper::OAuth::Scopes.from_string('public email phone')
77
- end
78
- let(:client_scopes) do
79
- Doorkeeper::OAuth::Scopes.from_string('public phone')
80
- end
81
-
82
- before do
83
- allow(server).to receive(:default_scopes).and_return(default_scopes)
84
- allow(server).to receive(:scopes).and_return(server_scopes)
85
- allow(server).to receive(:access_token_expires_in).and_return(100)
86
- allow(application).to receive(:scopes).and_return(client_scopes)
87
- allow(client).to receive(:id).and_return(nil)
88
- end
89
-
90
- it 'delegates the error to issuer if no scope was requested' do
91
- subject = ClientCredentialsRequest.new(server, client)
92
- subject.authorize
93
- expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
94
- expect(subject.error).to eq(:invalid_scope)
95
- end
96
-
97
- it 'issues an access token with requested scopes' do
98
- subject = ClientCredentialsRequest.new(server, client, scope: 'phone')
99
- subject.authorize
100
- expect(subject.response).to be_a(Doorkeeper::OAuth::TokenResponse)
101
- expect(subject.response.token.scopes_string).to eq('phone')
102
- end
103
- end
104
- end
105
- 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,43 +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 { subject.authorize }.not_to change { Doorkeeper::AccessGrant.count }
36
- end
37
-
38
- it 'returns a error response' do
39
- allow(pre_auth).to receive(:authorizable?).and_return(false)
40
- expect(subject.authorize).to be_a(ErrorResponse)
41
- end
42
- end
43
- 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 '.headers' do
47
- let(:error_response) { ErrorResponse.new(name: :some_error, state: :some_state) }
48
- subject { error_response.headers }
49
-
50
- it { expect(subject).to include 'WWW-Authenticate' }
51
-
52
- describe "WWW-Authenticate header" do
53
- subject { error_response.headers["WWW-Authenticate"] }
54
-
55
- it { expect(subject).to include("realm=\"#{error_response.realm}\"") }
56
- it { expect(subject).to include("error=\"#{error_response.name}\"") }
57
- it { expect(subject).to include("error_description=\"#{error_response.description}\"") }
58
- end
59
- end
60
- end
61
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/i18n'
3
- require 'doorkeeper/oauth/error'
4
-
5
- module Doorkeeper::OAuth
6
- describe Error do
7
- subject(:error) { Error.new(:some_error, :some_state) }
8
-
9
- it { expect(subject).to respond_to(:name) }
10
- it { expect(subject).to respond_to(:state) }
11
-
12
- describe :description do
13
- it 'is translated from translation messages' do
14
- expect(I18n).to receive(:translate).with(
15
- :some_error,
16
- scope: %i[doorkeeper errors messages],
17
- default: :server_error
18
- )
19
- error.description
20
- end
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_model'
3
- require 'doorkeeper'
4
- require 'doorkeeper/oauth/forbidden_token_response'
5
-
6
- module Doorkeeper::OAuth
7
- describe ForbiddenTokenResponse do
8
- describe '#name' do
9
- it { expect(subject.name).to eq(:invalid_scope) }
10
- end
11
-
12
- describe '#status' do
13
- it { expect(subject.status).to eq(:forbidden) }
14
- end
15
-
16
- describe :from_scopes do
17
- it 'should have a list of acceptable scopes' do
18
- response = ForbiddenTokenResponse.from_scopes(["public"])
19
- expect(response.description).to include('public')
20
- end
21
- end
22
- end
23
- end
@@ -1,64 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/string'
3
- require 'doorkeeper/oauth/helpers/scope_checker'
4
- require 'doorkeeper/oauth/scopes'
5
-
6
- module Doorkeeper::OAuth::Helpers
7
- describe ScopeChecker, '.valid?' do
8
- let(:server_scopes) { Doorkeeper::OAuth::Scopes.new }
9
-
10
- it 'is valid if scope is present' do
11
- server_scopes.add :scope
12
- expect(ScopeChecker.valid?('scope', server_scopes)).to be_truthy
13
- end
14
-
15
- it 'is invalid if includes tabs space' do
16
- expect(ScopeChecker.valid?("\tsomething", server_scopes)).to be_falsey
17
- end
18
-
19
- it 'is invalid if scope is not present' do
20
- expect(ScopeChecker.valid?(nil, server_scopes)).to be_falsey
21
- end
22
-
23
- it 'is invalid if scope is blank' do
24
- expect(ScopeChecker.valid?(' ', server_scopes)).to be_falsey
25
- end
26
-
27
- it 'is invalid if includes return space' do
28
- expect(ScopeChecker.valid?("scope\r", server_scopes)).to be_falsey
29
- end
30
-
31
- it 'is invalid if includes new lines' do
32
- expect(ScopeChecker.valid?("scope\nanother", server_scopes)).to be_falsey
33
- end
34
-
35
- it 'is invalid if any scope is not included in server scopes' do
36
- expect(ScopeChecker.valid?('scope another', server_scopes)).to be_falsey
37
- end
38
-
39
- context 'with application_scopes' do
40
- let(:server_scopes) do
41
- Doorkeeper::OAuth::Scopes.from_string 'common svr'
42
- end
43
- let(:application_scopes) do
44
- Doorkeeper::OAuth::Scopes.from_string 'app123'
45
- end
46
-
47
- it 'is valid if scope is included in the application scope list' do
48
- expect(ScopeChecker.valid?(
49
- 'app123',
50
- server_scopes,
51
- application_scopes
52
- )).to be_truthy
53
- end
54
-
55
- it 'is invalid if any scope is not included in the application' do
56
- expect(ScopeChecker.valid?(
57
- 'svr',
58
- server_scopes,
59
- application_scopes
60
- )).to be_falsey
61
- end
62
- end
63
- end
64
- end
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
- require 'doorkeeper/oauth/helpers/unique_token'
3
-
4
- module Doorkeeper::OAuth::Helpers
5
- describe UniqueToken do
6
- let :generator do
7
- ->(size) { 'a' * size }
8
- end
9
-
10
- it 'is able to customize the generator method' do
11
- token = UniqueToken.generate(generator: generator)
12
- expect(token).to eq('a' * 32)
13
- end
14
-
15
- it 'is able to customize the size of the token' do
16
- token = UniqueToken.generate(generator: generator, size: 2)
17
- expect(token).to eq('aa')
18
- end
19
- end
20
- end