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,14 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rails", git: 'https://github.com/rails/rails'
6
- gem "arel", git: 'https://github.com/rails/arel'
7
-
8
- gem "appraisal"
9
- gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
10
- gem "sqlite3", platform: [:ruby, :mswin, :mingw, :x64_mingw]
11
- gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
12
- gem "rspec-rails", "~> 3.7"
13
-
14
- gemspec path: "../"
@@ -1,45 +0,0 @@
1
- require 'doorkeeper/validations'
2
- require 'doorkeeper/oauth/scopes'
3
- require 'doorkeeper/oauth/helpers/scope_checker'
4
-
5
- module Doorkeeper
6
- module OAuth
7
- class ClientCredentialsRequest < BaseRequest
8
- class Validation
9
- include Validations
10
- include OAuth::Helpers
11
-
12
- validate :client, error: :invalid_client
13
- validate :scopes, error: :invalid_scope
14
-
15
- def initialize(server, request)
16
- @server, @request, @client = server, request, request.client
17
-
18
- validate
19
- end
20
-
21
- private
22
-
23
- def validate_client
24
- @client.present?
25
- end
26
-
27
- def validate_scopes
28
- return true unless @request.scopes.present?
29
-
30
- application_scopes = if @client.present?
31
- @client.application.scopes
32
- else
33
- ''
34
- end
35
-
36
- ScopeChecker.valid?(
37
- @request.scopes.to_s,
38
- @server.scopes,
39
- application_scopes
40
- )
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails/generators/active_record'
4
-
5
- module Doorkeeper
6
- class AddClientConfidentialityGenerator < ::Rails::Generators::Base
7
- include ::Rails::Generators::Migration
8
- source_root File.expand_path('templates', __dir__)
9
- desc 'Adds a migration to fix CVE-2018-1000211.'
10
-
11
- def install
12
- migration_template(
13
- 'add_confidential_to_application_migration.rb.erb',
14
- 'db/migrate/add_confidential_to_doorkeeper_application.rb',
15
- migration_version: migration_version
16
- )
17
- end
18
-
19
- def self.next_migration_number(dirname)
20
- ::ActiveRecord::Generators::Base.next_migration_number(dirname)
21
- end
22
-
23
- private
24
-
25
- def migration_version
26
- if ::ActiveRecord::VERSION::MAJOR >= 5
27
- "[#{::ActiveRecord::VERSION::MAJOR}.#{::ActiveRecord::VERSION::MINOR}]"
28
- end
29
- end
30
- end
31
- end
@@ -1,11 +0,0 @@
1
- class AddConfidentialToDoorkeeperApplication < ActiveRecord::Migration<%= migration_version %>
2
- def change
3
- add_column(
4
- :oauth_applications,
5
- :confidential,
6
- :boolean,
7
- null: false,
8
- default: true # maintaining backwards compatibility: require secrets
9
- )
10
- end
11
- end
@@ -1,10 +0,0 @@
1
- require "spec_helper_integration"
2
-
3
- describe Doorkeeper::ApplicationMetalController do
4
- it "lazy run hooks" do
5
- i = 0
6
- ActiveSupport.on_load(:doorkeeper_metal_controller) { i += 1 }
7
-
8
- expect(i).to eq 1
9
- end
10
- end
@@ -1,69 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper
4
- describe ApplicationsController do
5
- context 'when admin is not authenticated' do
6
- before do
7
- allow(Doorkeeper.configuration).to receive(:authenticate_admin).and_return(proc do
8
- redirect_to main_app.root_url
9
- end)
10
- end
11
-
12
- it 'redirects as set in Doorkeeper.authenticate_admin' do
13
- get :index
14
- expect(response).to redirect_to(controller.main_app.root_url)
15
- end
16
-
17
- it 'does not create application' do
18
- expect do
19
- post :create, doorkeeper_application: {
20
- name: 'Example',
21
- redirect_uri: 'https://example.com' }
22
- end.not_to change { Doorkeeper::Application.count }
23
- end
24
- end
25
-
26
- context 'when admin is authenticated' do
27
- render_views
28
-
29
- before do
30
- allow(Doorkeeper.configuration).to receive(:authenticate_admin).and_return(->(*) { true })
31
- end
32
-
33
- it 'sorts applications by created_at' do
34
- first_application = FactoryBot.create(:application)
35
- second_application = FactoryBot.create(:application)
36
- expect(Doorkeeper::Application).to receive(:ordered_by).and_call_original
37
- get :index
38
- expect(response.body).to have_selector("tbody tr:first-child#application_#{first_application.id}")
39
- expect(response.body).to have_selector("tbody tr:last-child#application_#{second_application.id}")
40
- end
41
-
42
- it 'creates application' do
43
- expect do
44
- post :create, doorkeeper_application: {
45
- name: 'Example',
46
- redirect_uri: 'https://example.com' }
47
- end.to change { Doorkeeper::Application.count }.by(1)
48
- expect(response).to be_redirect
49
- end
50
-
51
- it 'does not allow mass assignment of uid or secret' do
52
- application = FactoryBot.create(:application)
53
- put :update, id: application.id, doorkeeper_application: {
54
- uid: '1A2B3C4D',
55
- secret: '1A2B3C4D' }
56
-
57
- expect(application.reload.uid).not_to eq '1A2B3C4D'
58
- end
59
-
60
- it 'updates application' do
61
- application = FactoryBot.create(:application)
62
- put :update, id: application.id, doorkeeper_application: {
63
- name: 'Example',
64
- redirect_uri: 'https://example.com' }
65
- expect(application.reload.name).to eq 'Example'
66
- end
67
- end
68
- end
69
- end
@@ -1,250 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe Doorkeeper::AuthorizationsController, 'implicit grant flow' do
4
- include AuthorizationRequestHelper
5
-
6
- if Rails::VERSION::MAJOR >= 5
7
- class ActionDispatch::TestResponse
8
- def query_params
9
- @_query_params ||= begin
10
- fragment = URI.parse(location).fragment
11
- Rack::Utils.parse_query(fragment)
12
- end
13
- end
14
- end
15
- else
16
- class ActionController::TestResponse
17
- def query_params
18
- @_query_params ||= begin
19
- fragment = URI.parse(location).fragment
20
- Rack::Utils.parse_query(fragment)
21
- end
22
- end
23
- end
24
- end
25
-
26
- def translated_error_message(key)
27
- I18n.translate key, scope: %i[doorkeeper errors messages]
28
- end
29
-
30
- let(:client) { FactoryBot.create :application }
31
- let(:user) { User.create!(name: 'Joe', password: 'sekret') }
32
- let(:access_token) { FactoryBot.build :access_token, resource_owner_id: user.id, application_id: client.id }
33
-
34
- before do
35
- allow(Doorkeeper.configuration).to receive(:grant_flows).and_return(["implicit"])
36
- allow(controller).to receive(:current_resource_owner).and_return(user)
37
- end
38
-
39
- describe 'POST #create' do
40
- before do
41
- post :create, client_id: client.uid, response_type: 'token', redirect_uri: client.redirect_uri
42
- end
43
-
44
- it 'redirects after authorization' do
45
- expect(response).to be_redirect
46
- end
47
-
48
- it 'redirects to client redirect uri' do
49
- expect(response.location).to match(%r{^#{client.redirect_uri}})
50
- end
51
-
52
- it 'includes access token in fragment' do
53
- expect(response.query_params['access_token']).to eq(Doorkeeper::AccessToken.first.token)
54
- end
55
-
56
- it 'includes token type in fragment' do
57
- expect(response.query_params['token_type']).to eq('Bearer')
58
- end
59
-
60
- it 'includes token expiration in fragment' do
61
- expect(response.query_params['expires_in'].to_i).to eq(2.hours.to_i)
62
- end
63
-
64
- it 'issues the token for the current client' do
65
- expect(Doorkeeper::AccessToken.first.application_id).to eq(client.id)
66
- end
67
-
68
- it 'issues the token for the current resource owner' do
69
- expect(Doorkeeper::AccessToken.first.resource_owner_id).to eq(user.id)
70
- end
71
- end
72
-
73
- describe 'POST #create with errors' do
74
- before do
75
- default_scopes_exist :public
76
- post :create, client_id: client.uid, response_type: 'token', scope: 'invalid', redirect_uri: client.redirect_uri
77
- end
78
-
79
- it 'redirects after authorization' do
80
- expect(response).to be_redirect
81
- end
82
-
83
- it 'redirects to client redirect uri' do
84
- expect(response.location).to match(%r{^#{client.redirect_uri}})
85
- end
86
-
87
- it 'does not include access token in fragment' do
88
- expect(response.query_params['access_token']).to be_nil
89
- end
90
-
91
- it 'includes error in fragment' do
92
- expect(response.query_params['error']).to eq('invalid_scope')
93
- end
94
-
95
- it 'includes error description in fragment' do
96
- expect(response.query_params['error_description']).to eq(translated_error_message(:invalid_scope))
97
- end
98
-
99
- it 'does not issue any access token' do
100
- expect(Doorkeeper::AccessToken.all).to be_empty
101
- end
102
- end
103
-
104
- describe 'POST #create with application already authorized' do
105
- before do
106
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
107
-
108
- access_token.save!
109
- post :create, client_id: client.uid, response_type: 'token', redirect_uri: client.redirect_uri
110
- end
111
-
112
- it 'returns the existing access token in a fragment' do
113
- expect(response.query_params['access_token']).to eq(access_token.token)
114
- end
115
-
116
- it 'does not creates a new access token' do
117
- expect(Doorkeeper::AccessToken.count).to eq(1)
118
- end
119
- end
120
-
121
- describe 'GET #new token request with native url and skip_authorization true' do
122
- before do
123
- allow(Doorkeeper.configuration).to receive(:skip_authorization).and_return(proc do
124
- true
125
- end)
126
- client.update_attribute :redirect_uri, 'urn:ietf:wg:oauth:2.0:oob'
127
- get :new, client_id: client.uid, response_type: 'token', redirect_uri: client.redirect_uri
128
- end
129
-
130
- it 'should redirect immediately' do
131
- expect(response).to be_redirect
132
- expect(response.location).to match(/oauth\/token\/info\?access_token=/)
133
- end
134
-
135
- it 'should not issue a grant' do
136
- expect(Doorkeeper::AccessGrant.count).to be 0
137
- end
138
-
139
- it 'should issue a token' do
140
- expect(Doorkeeper::AccessToken.count).to be 1
141
- end
142
- end
143
-
144
- describe 'GET #new code request with native url and skip_authorization true' do
145
- before do
146
- allow(Doorkeeper.configuration).to receive(:grant_flows).
147
- and_return(%w[authorization_code])
148
- allow(Doorkeeper.configuration).to receive(:skip_authorization).and_return(proc do
149
- true
150
- end)
151
- client.update_attribute :redirect_uri, 'urn:ietf:wg:oauth:2.0:oob'
152
- get :new, client_id: client.uid, response_type: 'code', redirect_uri: client.redirect_uri
153
- end
154
-
155
- it 'should redirect immediately' do
156
- expect(response).to be_redirect
157
- expect(response.location).to match(/oauth\/authorize\/native\?code=#{Doorkeeper::AccessGrant.first.token}/)
158
- end
159
-
160
- it 'should issue a grant' do
161
- expect(Doorkeeper::AccessGrant.count).to be 1
162
- end
163
-
164
- it 'should not issue a token' do
165
- expect(Doorkeeper::AccessToken.count).to be 0
166
- end
167
-
168
- context 'with opt_out_native_route_change' do
169
- around(:each) do |example|
170
- Doorkeeper.configure do
171
- orm DOORKEEPER_ORM
172
- opt_out_native_route_change
173
- end
174
-
175
- Rails.application.reload_routes!
176
-
177
- example.run
178
-
179
- Doorkeeper.configure do
180
- orm DOORKEEPER_ORM
181
- end
182
-
183
- Rails.application.reload_routes!
184
- end
185
-
186
- it 'should redirect immediately' do
187
- expect(response).to be_redirect
188
- expect(response.location).to match(/oauth\/authorize\/#{Doorkeeper::AccessGrant.first.token}/)
189
- end
190
-
191
- it 'should issue a grant' do
192
- expect(Doorkeeper::AccessGrant.count).to be 1
193
- end
194
-
195
- it 'should not issue a token' do
196
- expect(Doorkeeper::AccessToken.count).to be 0
197
- end
198
- end
199
- end
200
-
201
- describe 'GET #new with skip_authorization true' do
202
- before do
203
- allow(Doorkeeper.configuration).to receive(:skip_authorization).and_return(proc do
204
- true
205
- end)
206
- get :new, client_id: client.uid, response_type: 'token', redirect_uri: client.redirect_uri
207
- end
208
-
209
- it 'should redirect immediately' do
210
- expect(response).to be_redirect
211
- expect(response.location).to match(%r{^#{client.redirect_uri}})
212
- end
213
-
214
- it 'should issue a token' do
215
- expect(Doorkeeper::AccessToken.count).to be 1
216
- end
217
-
218
- it 'includes token type in fragment' do
219
- expect(response.query_params['token_type']).to eq('Bearer')
220
- end
221
-
222
- it 'includes token expiration in fragment' do
223
- expect(response.query_params['expires_in'].to_i).to eq(2.hours.to_i)
224
- end
225
-
226
- it 'issues the token for the current client' do
227
- expect(Doorkeeper::AccessToken.first.application_id).to eq(client.id)
228
- end
229
-
230
- it 'issues the token for the current resource owner' do
231
- expect(Doorkeeper::AccessToken.first.resource_owner_id).to eq(user.id)
232
- end
233
- end
234
-
235
- describe 'GET #new with errors' do
236
- before do
237
- default_scopes_exist :public
238
- get :new, an_invalid: 'request'
239
- end
240
-
241
- it 'does not redirect' do
242
- expect(response).to_not be_redirect
243
- end
244
-
245
- it 'does not issue any token' do
246
- expect(Doorkeeper::AccessGrant.count).to eq 0
247
- expect(Doorkeeper::AccessToken.count).to eq 0
248
- end
249
- end
250
- end
@@ -1,309 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module ControllerActions
4
- def index
5
- render plain: 'index'
6
- end
7
-
8
- def show
9
- render plain: 'show'
10
- end
11
-
12
- def doorkeeper_unauthorized_render_options(*); end
13
-
14
- def doorkeeper_forbidden_render_options(*); end
15
- end
16
-
17
- describe 'doorkeeper authorize filter' do
18
- context 'accepts token code specified as' do
19
- controller do
20
- before_action :doorkeeper_authorize!
21
-
22
- def index
23
- render plain: 'index'
24
- end
25
- end
26
-
27
- let(:token_string) { '1A2BC3' }
28
- let(:token) do
29
- double(Doorkeeper::AccessToken,
30
- acceptable?: true, previous_refresh_token: "",
31
- revoke_previous_refresh_token!: true)
32
- end
33
-
34
- it 'access_token param' do
35
- expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
36
- get :index, access_token: token_string
37
- end
38
-
39
- it 'bearer_token param' do
40
- expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
41
- get :index, bearer_token: token_string
42
- end
43
-
44
- it 'Authorization header' do
45
- expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
46
- request.env['HTTP_AUTHORIZATION'] = "Bearer #{token_string}"
47
- get :index
48
- end
49
-
50
- it 'different kind of Authorization header' do
51
- expect(Doorkeeper::AccessToken).not_to receive(:by_token)
52
- request.env['HTTP_AUTHORIZATION'] = "MAC #{token_string}"
53
- get :index
54
- end
55
-
56
- it 'does not change Authorization header value' do
57
- expect(Doorkeeper::AccessToken).to receive(:by_token).exactly(2).times.and_return(token)
58
- request.env['HTTP_AUTHORIZATION'] = "Bearer #{token_string}"
59
- get :index
60
- controller.send(:remove_instance_variable, :@_doorkeeper_token)
61
- get :index
62
- end
63
- end
64
-
65
- context 'defined for all actions' do
66
- controller do
67
- before_action :doorkeeper_authorize!
68
-
69
- include ControllerActions
70
- end
71
-
72
- context 'with valid token', token: :valid do
73
- it 'allows into index action' do
74
- get :index, access_token: token_string
75
- expect(response).to be_successful
76
- end
77
-
78
- it 'allows into show action' do
79
- get :show, id: '4', access_token: token_string
80
- expect(response).to be_successful
81
- end
82
- end
83
-
84
- context 'with invalid token', token: :invalid do
85
- it 'does not allow into index action' do
86
- get :index, access_token: token_string
87
- expect(response.status).to eq 401
88
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
89
- end
90
-
91
- it 'does not allow into show action' do
92
- get :show, id: '4', access_token: token_string
93
- expect(response.status).to eq 401
94
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
95
- end
96
- end
97
- end
98
-
99
- context 'defined with scopes' do
100
- controller do
101
- before_action -> { doorkeeper_authorize! :write }
102
-
103
- include ControllerActions
104
- end
105
-
106
- let(:token_string) { '1A2DUWE' }
107
-
108
- it 'allows if the token has particular scopes' do
109
- token = double(Doorkeeper::AccessToken,
110
- accessible?: true, scopes: %w[write public],
111
- previous_refresh_token: "",
112
- revoke_previous_refresh_token!: true)
113
- expect(token).to receive(:acceptable?).with([:write]).and_return(true)
114
- expect(
115
- Doorkeeper::AccessToken
116
- ).to receive(:by_token).with(token_string).and_return(token)
117
-
118
- get :index, access_token: token_string
119
- expect(response).to be_successful
120
- end
121
-
122
- it 'does not allow if the token does not include given scope' do
123
- token = double(Doorkeeper::AccessToken,
124
- accessible?: true, scopes: ['public'], revoked?: false,
125
- expired?: false, previous_refresh_token: "",
126
- revoke_previous_refresh_token!: true)
127
- expect(
128
- Doorkeeper::AccessToken
129
- ).to receive(:by_token).with(token_string).and_return(token)
130
- expect(token).to receive(:acceptable?).with([:write]).and_return(false)
131
-
132
- get :index, access_token: token_string
133
- expect(response.status).to eq 403
134
- expect(response.header).to_not include('WWW-Authenticate')
135
- end
136
- end
137
-
138
- context 'when custom unauthorized render options are configured' do
139
- controller do
140
- before_action :doorkeeper_authorize!
141
-
142
- include ControllerActions
143
- end
144
-
145
- context 'with a JSON custom render', token: :invalid do
146
- before do
147
- module ControllerActions
148
- remove_method :doorkeeper_unauthorized_render_options
149
-
150
- def doorkeeper_unauthorized_render_options(error: nil)
151
- { json: ActiveSupport::JSON.encode(error_message: error.description) }
152
- end
153
- end
154
- end
155
-
156
- after do
157
- module ControllerActions
158
- remove_method :doorkeeper_unauthorized_render_options
159
-
160
- def doorkeeper_unauthorized_render_options(error: nil)
161
- end
162
- end
163
- end
164
-
165
- it 'it renders a custom JSON response', token: :invalid do
166
- get :index, access_token: token_string
167
- expect(response.status).to eq 401
168
- expect(response.content_type).to eq('application/json')
169
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
170
-
171
- expect(json_response).not_to be_nil
172
- expect(json_response['error_message']).to match('token is invalid')
173
- end
174
- end
175
-
176
- context 'with a text custom render', token: :invalid do
177
- before do
178
- module ControllerActions
179
- remove_method :doorkeeper_unauthorized_render_options
180
-
181
- def doorkeeper_unauthorized_render_options(**)
182
- { plain: 'Unauthorized' }
183
- end
184
- end
185
- end
186
-
187
- after do
188
- module ControllerActions
189
- remove_method :doorkeeper_unauthorized_render_options
190
-
191
- def doorkeeper_unauthorized_render_options(error: nil); end
192
- end
193
- end
194
-
195
- it 'it renders a custom text response', token: :invalid do
196
- get :index, access_token: token_string
197
- expect(response.status).to eq 401
198
- expect(response.content_type).to eq('text/plain')
199
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
200
- expect(response.body).to eq('Unauthorized')
201
- end
202
- end
203
- end
204
-
205
- context 'when custom forbidden render options are configured' do
206
- before do
207
- expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
208
- expect(token).to receive(:acceptable?).with([:write]).and_return(false)
209
- end
210
-
211
- after do
212
- module ControllerActions
213
- remove_method :doorkeeper_forbidden_render_options
214
-
215
- def doorkeeper_forbidden_render_options(*); end
216
- end
217
- end
218
-
219
- controller do
220
- before_action -> { doorkeeper_authorize! :write }
221
-
222
- include ControllerActions
223
- end
224
-
225
- let(:token) do
226
- double(Doorkeeper::AccessToken,
227
- accessible?: true, scopes: ['public'], revoked?: false,
228
- expired?: false, previous_refresh_token: "",
229
- revoke_previous_refresh_token!: true)
230
- end
231
-
232
- let(:token_string) { '1A2DUWE' }
233
-
234
- context 'with a JSON custom render' do
235
- before do
236
- module ControllerActions
237
- remove_method :doorkeeper_forbidden_render_options
238
-
239
- def doorkeeper_forbidden_render_options(*)
240
- { json: { error_message: 'Forbidden' } }
241
- end
242
- end
243
- end
244
-
245
- it 'renders a custom JSON response' do
246
- get :index, access_token: token_string
247
- expect(response.header).to_not include('WWW-Authenticate')
248
- expect(response.content_type).to eq('application/json')
249
- expect(response.status).to eq 403
250
-
251
- expect(json_response).not_to be_nil
252
- expect(json_response['error_message']).to match('Forbidden')
253
- end
254
- end
255
-
256
- context 'with a status and JSON custom render' do
257
- before do
258
- module ControllerActions
259
- remove_method :doorkeeper_forbidden_render_options
260
- def doorkeeper_forbidden_render_options(*)
261
- { json: { error_message: 'Not Found' },
262
- respond_not_found_when_forbidden: true }
263
- end
264
- end
265
- end
266
-
267
- it 'overrides the default status code' do
268
- get :index, access_token: token_string
269
- expect(response.status).to eq 404
270
- end
271
- end
272
-
273
- context 'with a text custom render' do
274
- before do
275
- module ControllerActions
276
- remove_method :doorkeeper_forbidden_render_options
277
-
278
- def doorkeeper_forbidden_render_options(*)
279
- { plain: 'Forbidden' }
280
- end
281
- end
282
- end
283
-
284
- it 'renders a custom status code and text response' do
285
- get :index, access_token: token_string
286
- expect(response.header).to_not include('WWW-Authenticate')
287
- expect(response.status).to eq 403
288
- expect(response.body).to eq('Forbidden')
289
- end
290
- end
291
-
292
- context 'with a status and text custom render' do
293
- before do
294
- module ControllerActions
295
- remove_method :doorkeeper_forbidden_render_options
296
-
297
- def doorkeeper_forbidden_render_options(*)
298
- { respond_not_found_when_forbidden: true, plain: 'Not Found' }
299
- end
300
- end
301
- end
302
-
303
- it 'overrides the default status code' do
304
- get :index, access_token: token_string
305
- expect(response.status).to eq 404
306
- end
307
- end
308
- end
309
- end