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,9 +0,0 @@
1
- module ConfigHelper
2
- def config_is_set(setting, value = nil, &block)
3
- setting_ivar = "@#{setting}"
4
- value = block_given? ? block : value
5
- Doorkeeper.configuration.instance_variable_set(setting_ivar, value)
6
- end
7
- end
8
-
9
- RSpec.configuration.send :include, ConfigHelper
@@ -1,72 +0,0 @@
1
- module ModelHelper
2
- def client_exists(client_attributes = {})
3
- @client = FactoryBot.create(:application, client_attributes)
4
- end
5
-
6
- def create_resource_owner
7
- @resource_owner = User.create!(name: 'Joe', password: 'sekret')
8
- end
9
-
10
- def authorization_code_exists(options = {})
11
- @authorization = FactoryBot.create(:access_grant, options)
12
- end
13
-
14
- def access_grant_should_exist_for(client, resource_owner)
15
- grant = Doorkeeper::AccessGrant.first
16
-
17
- expect(grant.application).to have_attributes(id: client.id).
18
- and(be_instance_of(Doorkeeper::Application))
19
-
20
- expect(grant.resource_owner_id).to eq(resource_owner.id)
21
- end
22
-
23
- def access_token_should_exist_for(client, resource_owner)
24
- token = Doorkeeper::AccessToken.first
25
-
26
- expect(token.application).to have_attributes(id: client.id).
27
- and(be_instance_of(Doorkeeper::Application))
28
-
29
- expect(token.resource_owner_id).to eq(resource_owner.id)
30
- end
31
-
32
- def access_grant_should_not_exist
33
- expect(Doorkeeper::AccessGrant.all).to be_empty
34
- end
35
-
36
- def access_token_should_not_exist
37
- expect(Doorkeeper::AccessToken.all).to be_empty
38
- end
39
-
40
- def access_grant_should_have_scopes(*args)
41
- grant = Doorkeeper::AccessGrant.first
42
- expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
43
- end
44
-
45
- def access_token_should_have_scopes(*args)
46
- grant = Doorkeeper::AccessToken.last
47
- expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
48
- end
49
-
50
- def uniqueness_error
51
- case DOORKEEPER_ORM
52
- when :active_record
53
- ActiveRecord::RecordNotUnique
54
- when :sequel
55
- error_classes = [Sequel::UniqueConstraintViolation, Sequel::ValidationFailed]
56
- proc { |error| expect(error.class).to be_in(error_classes) }
57
- when :mongo_mapper
58
- error_classes = [MongoMapper::DocumentNotValid, Mongo::OperationFailure]
59
- proc { |error| expect(error.class).to be_in(error_classes) }
60
- when /mongoid/
61
- error_classes = [Mongoid::Errors::Validations]
62
- error_classes << Moped::Errors::OperationFailure if defined?(::Moped) # Mongoid 4
63
- error_classes << Mongo::Error::OperationFailure if defined?(::Mongo) # Mongoid 5
64
-
65
- proc { |error| expect(error.class).to be_in(error_classes) }
66
- else
67
- raise "'#{DOORKEEPER_ORM}' ORM is not supported!"
68
- end
69
- end
70
- end
71
-
72
- RSpec.configuration.send :include, ModelHelper
@@ -1,88 +0,0 @@
1
- module RequestSpecHelper
2
- def i_should_see(content)
3
- expect(page).to have_content(content)
4
- end
5
-
6
- def i_should_not_see(content)
7
- expect(page).to have_no_content(content)
8
- end
9
-
10
- def i_should_be_on(path)
11
- expect(current_path).to eq(path)
12
- end
13
-
14
- def url_should_have_param(param, value)
15
- expect(current_params[param]).to eq(value)
16
- end
17
-
18
- def url_should_not_have_param(param)
19
- expect(current_params).not_to have_key(param)
20
- end
21
-
22
- def current_params
23
- Rack::Utils.parse_query(current_uri.query)
24
- end
25
-
26
- def current_uri
27
- URI.parse(page.current_url)
28
- end
29
-
30
- def request_response
31
- respond_to?(:response) ? response : page.driver.response
32
- end
33
-
34
- def json_response
35
- JSON.parse(request_response.body)
36
- end
37
-
38
- def should_have_header(header, value)
39
- expect(headers[header]).to eq(value)
40
- end
41
-
42
- def with_access_token_header(token)
43
- with_header 'Authorization', "Bearer #{token}"
44
- end
45
-
46
- def with_header(header, value)
47
- page.driver.header header, value
48
- end
49
-
50
- def basic_auth_header_for_client(client)
51
- ActionController::HttpAuthentication::Basic.encode_credentials client.uid, client.secret
52
- end
53
-
54
- def should_have_json(key, value)
55
- expect(json_response.fetch(key)).to eq(value)
56
- end
57
-
58
- def should_have_json_within(key, value, range)
59
- expect(json_response.fetch(key)).to be_within(range).of(value)
60
- end
61
-
62
- def should_not_have_json(key)
63
- expect(json_response).not_to have_key(key)
64
- end
65
-
66
- def sign_in
67
- visit '/'
68
- click_on 'Sign in'
69
- end
70
-
71
- def create_access_token(authorization_code, client)
72
- page.driver.post token_endpoint_url(code: authorization_code, client: client)
73
- end
74
-
75
- def i_should_see_translated_error_message(key)
76
- i_should_see translated_error_message(key)
77
- end
78
-
79
- def translated_error_message(key)
80
- I18n.translate key, scope: %i[doorkeeper errors messages]
81
- end
82
-
83
- def response_status_should_be(status)
84
- expect(request_response.status.to_i).to eq(status)
85
- end
86
- end
87
-
88
- RSpec.configuration.send :include, RequestSpecHelper
@@ -1,56 +0,0 @@
1
- module UrlHelper
2
- def token_endpoint_url(options = {})
3
- parameters = {
4
- code: options[:code],
5
- client_id: options[:client_id] || (options[:client] ? options[:client].uid : nil),
6
- client_secret: options[:client_secret] || (options[:client] ? options[:client].secret : nil),
7
- redirect_uri: options[:redirect_uri] || (options[:client] ? options[:client].redirect_uri : nil),
8
- grant_type: options[:grant_type] || 'authorization_code'
9
- }
10
- "/oauth/token?#{build_query(parameters)}"
11
- end
12
-
13
- def password_token_endpoint_url(options = {})
14
- parameters = {
15
- code: options[:code],
16
- client_id: options[:client_id] || (options[:client] ? options[:client].uid : nil),
17
- client_secret: options[:client_secret] || (options[:client] ? options[:client].secret : nil),
18
- username: options[:resource_owner_username] || (options[:resource_owner] ? options[:resource_owner].name : nil),
19
- password: options[:resource_owner_password] || (options[:resource_owner] ? options[:resource_owner].password : nil),
20
- scope: options[:scope],
21
- grant_type: 'password'
22
- }
23
- "/oauth/token?#{build_query(parameters)}"
24
- end
25
-
26
- def authorization_endpoint_url(options = {})
27
- parameters = {
28
- client_id: options[:client_id] || options[:client].uid,
29
- redirect_uri: options[:redirect_uri] || options[:client].redirect_uri,
30
- response_type: options[:response_type] || 'code',
31
- scope: options[:scope],
32
- state: options[:state]
33
- }.reject { |_, v| v.blank? }
34
- "/oauth/authorize?#{build_query(parameters)}"
35
- end
36
-
37
- def refresh_token_endpoint_url(options = {})
38
- parameters = {
39
- refresh_token: options[:refresh_token],
40
- client_id: options[:client_id] || options[:client].uid,
41
- client_secret: options[:client_secret] || options[:client].secret,
42
- grant_type: options[:grant_type] || 'refresh_token'
43
- }
44
- "/oauth/token?#{build_query(parameters)}"
45
- end
46
-
47
- def revocation_token_endpoint_url
48
- '/oauth/revoke'
49
- end
50
-
51
- def build_query(hash)
52
- Rack::Utils.build_query(hash)
53
- end
54
- end
55
-
56
- RSpec.configuration.send :include, UrlHelper
@@ -1,38 +0,0 @@
1
- # Rails 5 deprecates calling HTTP action methods with positional arguments
2
- # in favor of keyword arguments. However, the keyword argument form is only
3
- # supported in Rails 5+. Since we support back to 4, we need some sort of shim
4
- # to avoid super noisy deprecations when running tests.
5
- module RoutingHTTPMethodShim
6
- def get(path, params = {}, headers = nil)
7
- super(path, params: params, headers: headers)
8
- end
9
-
10
- def post(path, params = {}, headers = nil)
11
- super(path, params: params, headers: headers)
12
- end
13
-
14
- def put(path, params = {}, headers = nil)
15
- super(path, params: params, headers: headers)
16
- end
17
- end
18
-
19
- module ControllerHTTPMethodShim
20
- def get(path, params = {})
21
- super(path, params: params)
22
- end
23
-
24
- def post(path, params = {})
25
- super(path, params: params)
26
- end
27
-
28
- def put(path, params = {})
29
- super(path, params: params)
30
- end
31
- end
32
-
33
- if ::Rails::VERSION::MAJOR >= 5
34
- RSpec.configure do |config|
35
- config.include ControllerHTTPMethodShim, type: :controller
36
- config.include RoutingHTTPMethodShim, type: :request
37
- end
38
- end
@@ -1,3 +0,0 @@
1
- # load schema to in memory sqlite
2
- ActiveRecord::Migration.verbose = false
3
- load Rails.root + 'db/schema.rb'
@@ -1,65 +0,0 @@
1
- shared_context 'valid token', token: :valid do
2
- let(:token_string) { '1A2B3C4D' }
3
-
4
- let :token do
5
- double(Doorkeeper::AccessToken,
6
- accessible?: true, includes_scope?: true, acceptable?: true,
7
- previous_refresh_token: "", revoke_previous_refresh_token!: true)
8
- end
9
-
10
- before :each do
11
- allow(
12
- Doorkeeper::AccessToken
13
- ).to receive(:by_token).with(token_string).and_return(token)
14
- end
15
- end
16
-
17
- shared_context 'invalid token', token: :invalid do
18
- let(:token_string) { '1A2B3C4D' }
19
-
20
- let :token do
21
- double(Doorkeeper::AccessToken,
22
- accessible?: false, revoked?: false, expired?: false,
23
- includes_scope?: false, acceptable?: false,
24
- previous_refresh_token: "", revoke_previous_refresh_token!: true)
25
- end
26
-
27
- before :each do
28
- allow(
29
- Doorkeeper::AccessToken
30
- ).to receive(:by_token).with(token_string).and_return(token)
31
- end
32
- end
33
-
34
- shared_context 'authenticated resource owner' do
35
- before do
36
- user = double(:resource, id: 1)
37
- allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { user } }
38
- end
39
- end
40
-
41
- shared_context 'not authenticated resource owner' do
42
- before do
43
- allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { redirect_to '/' } }
44
- end
45
- end
46
-
47
- shared_context 'valid authorization request' do
48
- let :authorization do
49
- double(:authorization, valid?: true, authorize: true, success_redirect_uri: 'http://something.com/cb?code=token')
50
- end
51
-
52
- before do
53
- allow(controller).to receive(:authorization) { authorization }
54
- end
55
- end
56
-
57
- shared_context 'invalid authorization request' do
58
- let :authorization do
59
- double(:authorization, valid?: false, authorize: false, redirect_on_error?: false)
60
- end
61
-
62
- before do
63
- allow(controller).to receive(:authorization) { authorization }
64
- end
65
- end
@@ -1,52 +0,0 @@
1
- shared_examples 'an accessible token' do
2
- describe :accessible? do
3
- it 'is accessible if token is not expired' do
4
- allow(subject).to receive(:expired?).and_return(false)
5
- should be_accessible
6
- end
7
-
8
- it 'is not accessible if token is expired' do
9
- allow(subject).to receive(:expired?).and_return(true)
10
- should_not be_accessible
11
- end
12
- end
13
- end
14
-
15
- shared_examples 'a revocable token' do
16
- describe :accessible? do
17
- before { subject.save! }
18
-
19
- it 'is accessible if token is not revoked' do
20
- expect(subject).to be_accessible
21
- end
22
-
23
- it 'is not accessible if token is revoked' do
24
- subject.revoke
25
- expect(subject).not_to be_accessible
26
- end
27
- end
28
- end
29
-
30
- shared_examples 'a unique token' do
31
- describe :token do
32
- it 'is generated before validation' do
33
- expect { subject.valid? }.to change { subject.token }.from(nil)
34
- end
35
-
36
- it 'is not valid if token exists' do
37
- token1 = FactoryBot.create factory_name
38
- token2 = FactoryBot.create factory_name
39
- token2.token = token1.token
40
- expect(token2).not_to be_valid
41
- end
42
-
43
- it 'expects database to throw an error when tokens are the same' do
44
- token1 = FactoryBot.create factory_name
45
- token2 = FactoryBot.create factory_name
46
- token2.token = token1.token
47
- expect do
48
- token2.save!(validate: false)
49
- end.to raise_error(uniqueness_error)
50
- end
51
- end
52
- end
@@ -1,123 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe RedirectUriValidator do
4
- subject do
5
- FactoryBot.create(:application)
6
- end
7
-
8
- it 'is valid when the uri is a uri' do
9
- subject.redirect_uri = 'https://example.com/callback'
10
- expect(subject).to be_valid
11
- end
12
-
13
- # Most mobile and desktop operating systems allow apps to register a custom URL
14
- # scheme that will launch the app when a URL with that scheme is visited from
15
- # the system browser.
16
- #
17
- # @see https://www.oauth.com/oauth2-servers/redirect-uris/redirect-uris-native-apps/
18
- it 'is valid when the uri is custom native URI' do
19
- subject.redirect_uri = 'myapp://callback'
20
- expect(subject).to be_valid
21
- end
22
-
23
- it 'is valid when the uri has a query parameter' do
24
- subject.redirect_uri = 'https://example.com/abcd?xyz=123'
25
- expect(subject).to be_valid
26
- end
27
-
28
- it 'accepts native redirect uri' do
29
- subject.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
30
- expect(subject).to be_valid
31
- end
32
-
33
- it 'rejects if test uri is disabled' do
34
- allow(RedirectUriValidator).to receive(:native_redirect_uri).and_return(nil)
35
- subject.redirect_uri = 'urn:some:test'
36
- expect(subject).not_to be_valid
37
- end
38
-
39
- it 'is invalid when the uri is not a uri' do
40
- subject.redirect_uri = ']'
41
- expect(subject).not_to be_valid
42
- expect(subject.errors[:redirect_uri].first).to eq('must be a valid URI.')
43
- end
44
-
45
- it 'is invalid when the uri is relative' do
46
- subject.redirect_uri = '/abcd'
47
- expect(subject).not_to be_valid
48
- expect(subject.errors[:redirect_uri].first).to eq('must be an absolute URI.')
49
- end
50
-
51
- it 'is invalid when the uri has a fragment' do
52
- subject.redirect_uri = 'https://example.com/abcd#xyz'
53
- expect(subject).not_to be_valid
54
- expect(subject.errors[:redirect_uri].first).to eq('cannot contain a fragment.')
55
- end
56
-
57
- context 'force secured uri' do
58
- it 'accepts an valid uri' do
59
- subject.redirect_uri = 'https://example.com/callback'
60
- expect(subject).to be_valid
61
- end
62
-
63
- it 'accepts native redirect uri' do
64
- subject.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
65
- expect(subject).to be_valid
66
- end
67
-
68
- it 'accepts app redirect uri' do
69
- subject.redirect_uri = 'some-awesome-app://oauth/callback'
70
- expect(subject).to be_valid
71
- end
72
-
73
- it 'accepts a non secured protocol when disabled' do
74
- subject.redirect_uri = 'http://example.com/callback'
75
- allow(Doorkeeper.configuration).to receive(
76
- :force_ssl_in_redirect_uri
77
- ).and_return(false)
78
- expect(subject).to be_valid
79
- end
80
-
81
- it 'accepts a non secured protocol when conditional option defined' do
82
- Doorkeeper.configure do
83
- orm DOORKEEPER_ORM
84
- force_ssl_in_redirect_uri { |uri| uri.host != 'localhost' }
85
- end
86
-
87
- application = FactoryBot.build(:application, redirect_uri: 'http://localhost/callback')
88
- expect(application).to be_valid
89
-
90
- application = FactoryBot.build(:application, redirect_uri: 'http://localhost2/callback')
91
- expect(application).not_to be_valid
92
- end
93
-
94
- it 'forbids redirect uri if required' do
95
- subject.redirect_uri = 'javascript://document.cookie'
96
-
97
- Doorkeeper.configure do
98
- orm DOORKEEPER_ORM
99
- forbid_redirect_uri { |uri| uri.scheme == 'javascript' }
100
- end
101
-
102
- expect(subject).to be_invalid
103
- expect(subject.errors[:redirect_uri].first).to eq('is forbidden by the server.')
104
-
105
- subject.redirect_uri = 'https://localhost/callback'
106
- expect(subject).to be_valid
107
- end
108
-
109
- it 'invalidates the uri when the uri does not use a secure protocol' do
110
- subject.redirect_uri = 'http://example.com/callback'
111
- expect(subject).not_to be_valid
112
- error = subject.errors[:redirect_uri].first
113
- expect(error).to eq('must be an HTTPS/SSL URI.')
114
- end
115
- end
116
-
117
- context 'multiple redirect uri' do
118
- it 'invalidates the second uri when the first uri is native uri' do
119
- subject.redirect_uri = "urn:ietf:wg:oauth:2.0:oob\nexample.com/callback"
120
- expect(subject).to be_invalid
121
- end
122
- end
123
- end