doorkeeper 5.1.2 → 5.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. checksums.yaml +4 -4
  2. data/{NEWS.md → CHANGELOG.md} +314 -27
  3. data/README.md +39 -22
  4. data/app/controllers/doorkeeper/application_controller.rb +3 -2
  5. data/app/controllers/doorkeeper/application_metal_controller.rb +3 -2
  6. data/app/controllers/doorkeeper/applications_controller.rb +5 -4
  7. data/app/controllers/doorkeeper/authorizations_controller.rb +76 -25
  8. data/app/controllers/doorkeeper/authorized_applications_controller.rb +5 -5
  9. data/app/controllers/doorkeeper/token_info_controller.rb +12 -2
  10. data/app/controllers/doorkeeper/tokens_controller.rb +99 -28
  11. data/app/helpers/doorkeeper/dashboard_helper.rb +1 -1
  12. data/app/views/doorkeeper/applications/_form.html.erb +1 -7
  13. data/app/views/doorkeeper/applications/show.html.erb +35 -14
  14. data/app/views/doorkeeper/authorizations/error.html.erb +3 -1
  15. data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
  16. data/app/views/doorkeeper/authorizations/new.html.erb +16 -14
  17. data/config/locales/en.yml +16 -3
  18. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  19. data/lib/doorkeeper/config/option.rb +20 -2
  20. data/lib/doorkeeper/config/validations.rb +53 -0
  21. data/lib/doorkeeper/config.rb +300 -136
  22. data/lib/doorkeeper/engine.rb +10 -3
  23. data/lib/doorkeeper/errors.rb +13 -18
  24. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  25. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  26. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  27. data/lib/doorkeeper/grant_flow.rb +45 -0
  28. data/lib/doorkeeper/grape/helpers.rb +7 -3
  29. data/lib/doorkeeper/helpers/controller.rb +36 -11
  30. data/lib/doorkeeper/models/access_grant_mixin.rb +23 -19
  31. data/lib/doorkeeper/models/access_token_mixin.rb +195 -52
  32. data/lib/doorkeeper/models/application_mixin.rb +8 -7
  33. data/lib/doorkeeper/models/concerns/expirable.rb +1 -1
  34. data/lib/doorkeeper/models/concerns/expiration_time_sql_math.rb +88 -0
  35. data/lib/doorkeeper/models/concerns/ownership.rb +1 -1
  36. data/lib/doorkeeper/models/concerns/polymorphic_resource_owner.rb +30 -0
  37. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  38. data/lib/doorkeeper/models/concerns/reusable.rb +1 -1
  39. data/lib/doorkeeper/models/concerns/revocable.rb +1 -28
  40. data/lib/doorkeeper/models/concerns/scopes.rb +5 -1
  41. data/lib/doorkeeper/models/concerns/secret_storable.rb +1 -3
  42. data/lib/doorkeeper/oauth/authorization/code.rb +31 -14
  43. data/lib/doorkeeper/oauth/authorization/context.rb +5 -5
  44. data/lib/doorkeeper/oauth/authorization/token.rb +30 -19
  45. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +4 -4
  46. data/lib/doorkeeper/oauth/authorization_code_request.rb +51 -22
  47. data/lib/doorkeeper/oauth/base_request.rb +21 -22
  48. data/lib/doorkeeper/oauth/client/credentials.rb +2 -4
  49. data/lib/doorkeeper/oauth/client.rb +8 -9
  50. data/lib/doorkeeper/oauth/client_credentials/creator.rb +42 -5
  51. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +10 -8
  52. data/lib/doorkeeper/oauth/client_credentials/{validation.rb → validator.rb} +14 -5
  53. data/lib/doorkeeper/oauth/client_credentials_request.rb +8 -7
  54. data/lib/doorkeeper/oauth/code_request.rb +6 -12
  55. data/lib/doorkeeper/oauth/code_response.rb +24 -14
  56. data/lib/doorkeeper/oauth/error.rb +1 -1
  57. data/lib/doorkeeper/oauth/error_response.rb +11 -13
  58. data/lib/doorkeeper/oauth/forbidden_token_response.rb +2 -1
  59. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +8 -12
  60. data/lib/doorkeeper/oauth/helpers/unique_token.rb +10 -7
  61. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +19 -23
  62. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  63. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  64. data/lib/doorkeeper/oauth/invalid_token_response.rb +7 -4
  65. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  66. data/lib/doorkeeper/oauth/password_access_token_request.rb +34 -11
  67. data/lib/doorkeeper/oauth/pre_authorization.rb +114 -44
  68. data/lib/doorkeeper/oauth/refresh_token_request.rb +54 -34
  69. data/lib/doorkeeper/oauth/token.rb +6 -7
  70. data/lib/doorkeeper/oauth/token_introspection.rb +28 -22
  71. data/lib/doorkeeper/oauth/token_request.rb +6 -20
  72. data/lib/doorkeeper/oauth/token_response.rb +2 -3
  73. data/lib/doorkeeper/orm/active_record/access_grant.rb +4 -43
  74. data/lib/doorkeeper/orm/active_record/access_token.rb +4 -35
  75. data/lib/doorkeeper/orm/active_record/application.rb +5 -149
  76. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +63 -0
  77. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +77 -0
  78. data/lib/doorkeeper/orm/active_record/mixins/application.rb +210 -0
  79. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  80. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +5 -2
  81. data/lib/doorkeeper/orm/active_record.rb +29 -22
  82. data/lib/doorkeeper/rails/helpers.rb +4 -4
  83. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  84. data/lib/doorkeeper/rails/routes/mapper.rb +2 -2
  85. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  86. data/lib/doorkeeper/rails/routes.rb +28 -27
  87. data/lib/doorkeeper/rake/db.rake +6 -6
  88. data/lib/doorkeeper/request/authorization_code.rb +5 -3
  89. data/lib/doorkeeper/request/client_credentials.rb +2 -2
  90. data/lib/doorkeeper/request/password.rb +3 -2
  91. data/lib/doorkeeper/request/refresh_token.rb +5 -4
  92. data/lib/doorkeeper/request/strategy.rb +2 -2
  93. data/lib/doorkeeper/request.rb +49 -17
  94. data/lib/doorkeeper/server.rb +7 -11
  95. data/lib/doorkeeper/stale_records_cleaner.rb +6 -2
  96. data/lib/doorkeeper/version.rb +2 -6
  97. data/lib/doorkeeper.rb +183 -80
  98. data/lib/generators/doorkeeper/application_owner_generator.rb +1 -1
  99. data/lib/generators/doorkeeper/confidential_applications_generator.rb +2 -2
  100. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  101. data/lib/generators/doorkeeper/migration_generator.rb +1 -1
  102. data/lib/generators/doorkeeper/pkce_generator.rb +1 -1
  103. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +7 -7
  104. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +3 -1
  105. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
  106. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +2 -0
  107. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  108. data/lib/generators/doorkeeper/templates/initializer.rb +230 -50
  109. data/lib/generators/doorkeeper/templates/migration.rb.erb +31 -9
  110. metadata +61 -327
  111. data/.coveralls.yml +0 -1
  112. data/.github/ISSUE_TEMPLATE.md +0 -25
  113. data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  114. data/.gitignore +0 -20
  115. data/.gitlab-ci.yml +0 -16
  116. data/.hound.yml +0 -3
  117. data/.rspec +0 -1
  118. data/.rubocop.yml +0 -50
  119. data/.travis.yml +0 -35
  120. data/Appraisals +0 -40
  121. data/CODE_OF_CONDUCT.md +0 -46
  122. data/CONTRIBUTING.md +0 -47
  123. data/Dangerfile +0 -67
  124. data/Gemfile +0 -24
  125. data/RELEASING.md +0 -10
  126. data/Rakefile +0 -28
  127. data/SECURITY.md +0 -15
  128. data/UPGRADE.md +0 -2
  129. data/app/validators/redirect_uri_validator.rb +0 -50
  130. data/bin/console +0 -16
  131. data/doorkeeper.gemspec +0 -34
  132. data/gemfiles/rails_5_0.gemfile +0 -17
  133. data/gemfiles/rails_5_1.gemfile +0 -17
  134. data/gemfiles/rails_5_2.gemfile +0 -17
  135. data/gemfiles/rails_6_0.gemfile +0 -17
  136. data/gemfiles/rails_master.gemfile +0 -17
  137. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  138. data/spec/controllers/applications_controller_spec.rb +0 -180
  139. data/spec/controllers/authorizations_controller_spec.rb +0 -527
  140. data/spec/controllers/protected_resources_controller_spec.rb +0 -353
  141. data/spec/controllers/token_info_controller_spec.rb +0 -50
  142. data/spec/controllers/tokens_controller_spec.rb +0 -330
  143. data/spec/dummy/Rakefile +0 -9
  144. data/spec/dummy/app/assets/config/manifest.js +0 -2
  145. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  146. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
  147. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
  148. data/spec/dummy/app/controllers/home_controller.rb +0 -18
  149. data/spec/dummy/app/controllers/metal_controller.rb +0 -13
  150. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
  151. data/spec/dummy/app/helpers/application_helper.rb +0 -7
  152. data/spec/dummy/app/models/user.rb +0 -7
  153. data/spec/dummy/app/views/home/index.html.erb +0 -0
  154. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  155. data/spec/dummy/config/application.rb +0 -47
  156. data/spec/dummy/config/boot.rb +0 -7
  157. data/spec/dummy/config/database.yml +0 -15
  158. data/spec/dummy/config/environment.rb +0 -5
  159. data/spec/dummy/config/environments/development.rb +0 -31
  160. data/spec/dummy/config/environments/production.rb +0 -64
  161. data/spec/dummy/config/environments/test.rb +0 -45
  162. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
  163. data/spec/dummy/config/initializers/doorkeeper.rb +0 -121
  164. data/spec/dummy/config/initializers/secret_token.rb +0 -10
  165. data/spec/dummy/config/initializers/session_store.rb +0 -10
  166. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  167. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  168. data/spec/dummy/config/routes.rb +0 -13
  169. data/spec/dummy/config.ru +0 -6
  170. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  171. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  172. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -69
  173. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  174. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  175. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -8
  176. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -13
  177. data/spec/dummy/db/schema.rb +0 -68
  178. data/spec/dummy/public/404.html +0 -26
  179. data/spec/dummy/public/422.html +0 -26
  180. data/spec/dummy/public/500.html +0 -26
  181. data/spec/dummy/public/favicon.ico +0 -0
  182. data/spec/dummy/script/rails +0 -9
  183. data/spec/factories.rb +0 -30
  184. data/spec/generators/application_owner_generator_spec.rb +0 -28
  185. data/spec/generators/confidential_applications_generator_spec.rb +0 -29
  186. data/spec/generators/install_generator_spec.rb +0 -36
  187. data/spec/generators/migration_generator_spec.rb +0 -28
  188. data/spec/generators/pkce_generator_spec.rb +0 -28
  189. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
  190. data/spec/generators/templates/routes.rb +0 -4
  191. data/spec/generators/views_generator_spec.rb +0 -29
  192. data/spec/grape/grape_integration_spec.rb +0 -137
  193. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  194. data/spec/lib/config_spec.rb +0 -697
  195. data/spec/lib/doorkeeper_spec.rb +0 -27
  196. data/spec/lib/models/expirable_spec.rb +0 -61
  197. data/spec/lib/models/reusable_spec.rb +0 -40
  198. data/spec/lib/models/revocable_spec.rb +0 -59
  199. data/spec/lib/models/scopes_spec.rb +0 -53
  200. data/spec/lib/models/secret_storable_spec.rb +0 -135
  201. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
  202. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -156
  203. data/spec/lib/oauth/base_request_spec.rb +0 -205
  204. data/spec/lib/oauth/base_response_spec.rb +0 -47
  205. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  206. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -94
  207. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -112
  208. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -59
  209. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -29
  210. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -109
  211. data/spec/lib/oauth/client_spec.rb +0 -38
  212. data/spec/lib/oauth/code_request_spec.rb +0 -47
  213. data/spec/lib/oauth/code_response_spec.rb +0 -36
  214. data/spec/lib/oauth/error_response_spec.rb +0 -66
  215. data/spec/lib/oauth/error_spec.rb +0 -23
  216. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -22
  217. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -98
  218. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  219. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -247
  220. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -55
  221. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -192
  222. data/spec/lib/oauth/pre_authorization_spec.rb +0 -215
  223. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -177
  224. data/spec/lib/oauth/scopes_spec.rb +0 -148
  225. data/spec/lib/oauth/token_request_spec.rb +0 -150
  226. data/spec/lib/oauth/token_response_spec.rb +0 -86
  227. data/spec/lib/oauth/token_spec.rb +0 -158
  228. data/spec/lib/request/strategy_spec.rb +0 -54
  229. data/spec/lib/secret_storing/base_spec.rb +0 -60
  230. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
  231. data/spec/lib/secret_storing/plain_spec.rb +0 -44
  232. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
  233. data/spec/lib/server_spec.rb +0 -61
  234. data/spec/lib/stale_records_cleaner_spec.rb +0 -89
  235. data/spec/models/doorkeeper/access_grant_spec.rb +0 -144
  236. data/spec/models/doorkeeper/access_token_spec.rb +0 -591
  237. data/spec/models/doorkeeper/application_spec.rb +0 -472
  238. data/spec/requests/applications/applications_request_spec.rb +0 -259
  239. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  240. data/spec/requests/endpoints/authorization_spec.rb +0 -73
  241. data/spec/requests/endpoints/token_spec.rb +0 -75
  242. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -78
  243. data/spec/requests/flows/authorization_code_spec.rb +0 -447
  244. data/spec/requests/flows/client_credentials_spec.rb +0 -128
  245. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -34
  246. data/spec/requests/flows/implicit_grant_spec.rb +0 -90
  247. data/spec/requests/flows/password_spec.rb +0 -259
  248. data/spec/requests/flows/refresh_token_spec.rb +0 -233
  249. data/spec/requests/flows/revoke_token_spec.rb +0 -143
  250. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  251. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  252. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  253. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  254. data/spec/routing/default_routes_spec.rb +0 -41
  255. data/spec/routing/scoped_routes_spec.rb +0 -47
  256. data/spec/spec_helper.rb +0 -57
  257. data/spec/spec_helper_integration.rb +0 -4
  258. data/spec/support/dependencies/factory_bot.rb +0 -4
  259. data/spec/support/doorkeeper_rspec.rb +0 -22
  260. data/spec/support/helpers/access_token_request_helper.rb +0 -13
  261. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  262. data/spec/support/helpers/config_helper.rb +0 -11
  263. data/spec/support/helpers/model_helper.rb +0 -78
  264. data/spec/support/helpers/request_spec_helper.rb +0 -98
  265. data/spec/support/helpers/url_helper.rb +0 -62
  266. data/spec/support/http_method_shim.rb +0 -29
  267. data/spec/support/orm/active_record.rb +0 -5
  268. data/spec/support/shared/controllers_shared_context.rb +0 -123
  269. data/spec/support/shared/hashing_shared_context.rb +0 -36
  270. data/spec/support/shared/models_shared_examples.rb +0 -54
  271. data/spec/validators/redirect_uri_validator_spec.rb +0 -158
  272. data/spec/version/version_spec.rb +0 -17
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module UrlHelper
4
- def token_endpoint_url(options = {})
5
- parameters = {
6
- code: options[:code],
7
- client_id: options[:client_id] || options[:client].try(:uid),
8
- client_secret: options[:client_secret] || options[:client].try(:secret),
9
- redirect_uri: options[:redirect_uri] || options[:client].try(:redirect_uri),
10
- grant_type: options[:grant_type] || "authorization_code",
11
- code_verifier: options[:code_verifier],
12
- code_challenge_method: options[:code_challenge_method],
13
- }.reject { |_, v| v.blank? }
14
- "/oauth/token?#{build_query(parameters)}"
15
- end
16
-
17
- def password_token_endpoint_url(options = {})
18
- parameters = {
19
- code: options[:code],
20
- client_id: options[:client_id] || options[:client].try(:uid),
21
- client_secret: options[:client_secret] || options[:client].try(:secret),
22
- username: options[:resource_owner_username] || options[:resource_owner].try(:name),
23
- password: options[:resource_owner_password] || options[:resource_owner].try(:password),
24
- scope: options[:scope],
25
- grant_type: "password",
26
- }
27
- "/oauth/token?#{build_query(parameters)}"
28
- end
29
-
30
- def authorization_endpoint_url(options = {})
31
- parameters = {
32
- client_id: options[:client_id] || options[:client].try(:uid),
33
- redirect_uri: options[:redirect_uri] || options[:client].try(:redirect_uri),
34
- response_type: options[:response_type] || "code",
35
- scope: options[:scope],
36
- state: options[:state],
37
- code_challenge: options[:code_challenge],
38
- code_challenge_method: options[:code_challenge_method],
39
- }.reject { |_, v| v.blank? }
40
- "/oauth/authorize?#{build_query(parameters)}"
41
- end
42
-
43
- def refresh_token_endpoint_url(options = {})
44
- parameters = {
45
- refresh_token: options[:refresh_token],
46
- client_id: options[:client_id] || options[:client].try(:uid),
47
- client_secret: options[:client_secret] || options[:client].try(:secret),
48
- grant_type: options[:grant_type] || "refresh_token",
49
- }
50
- "/oauth/token?#{build_query(parameters)}"
51
- end
52
-
53
- def revocation_token_endpoint_url
54
- "/oauth/revoke"
55
- end
56
-
57
- def build_query(hash)
58
- Rack::Utils.build_query(hash)
59
- end
60
- end
61
-
62
- RSpec.configuration.send :include, UrlHelper
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Rails 5 deprecates calling HTTP action methods with positional arguments
4
- # in favor of keyword arguments. However, the keyword argument form is only
5
- # supported in Rails 5+. Since we support back to 4, we need some sort of shim
6
- # to avoid super noisy deprecations when running tests.
7
- module RoutingHTTPMethodShim
8
- def get(path, **args)
9
- super(path, args[:params], args[:headers])
10
- end
11
-
12
- def post(path, **args)
13
- super(path, args[:params], args[:headers])
14
- end
15
-
16
- def put(path, **args)
17
- super(path, args[:params], args[:headers])
18
- end
19
- end
20
-
21
- module ControllerHTTPMethodShim
22
- def process(action, http_method = "GET", **args)
23
- if (as = args.delete(:as))
24
- @request.headers["Content-Type"] = Mime[as].to_s
25
- end
26
-
27
- super(action, http_method, args[:params], args[:session], args[:flash])
28
- end
29
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # load schema to in memory sqlite
4
- ActiveRecord::Migration.verbose = false
5
- load Rails.root + "db/schema.rb"
@@ -1,123 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- shared_context "valid token", token: :valid do
4
- let(:token_string) { "1A2B3C4D" }
5
-
6
- let :token do
7
- double(Doorkeeper::AccessToken,
8
- accessible?: true, includes_scope?: true, acceptable?: true,
9
- previous_refresh_token: "", revoke_previous_refresh_token!: true)
10
- end
11
-
12
- before :each do
13
- allow(
14
- Doorkeeper::AccessToken
15
- ).to receive(:by_token).with(token_string).and_return(token)
16
- end
17
- end
18
-
19
- shared_context "invalid token", token: :invalid do
20
- let(:token_string) { "1A2B3C4D" }
21
-
22
- let :token do
23
- double(Doorkeeper::AccessToken,
24
- accessible?: false, revoked?: false, expired?: false,
25
- includes_scope?: false, acceptable?: false,
26
- previous_refresh_token: "", revoke_previous_refresh_token!: true)
27
- end
28
-
29
- before :each do
30
- allow(
31
- Doorkeeper::AccessToken
32
- ).to receive(:by_token).with(token_string).and_return(token)
33
- end
34
- end
35
-
36
- shared_context "authenticated resource owner" do
37
- before do
38
- user = double(:resource, id: 1)
39
- allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { user } }
40
- end
41
- end
42
-
43
- shared_context "not authenticated resource owner" do
44
- before do
45
- allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { redirect_to "/" } }
46
- end
47
- end
48
-
49
- shared_context "valid authorization request" do
50
- let :authorization do
51
- double(:authorization, valid?: true, authorize: true, success_redirect_uri: "http://something.com/cb?code=token")
52
- end
53
-
54
- before do
55
- allow(controller).to receive(:authorization) { authorization }
56
- end
57
- end
58
-
59
- shared_context "invalid authorization request" do
60
- let :authorization do
61
- double(:authorization, valid?: false, authorize: false, redirect_on_error?: false)
62
- end
63
-
64
- before do
65
- allow(controller).to receive(:authorization) { authorization }
66
- end
67
- end
68
-
69
- shared_context "expired token", token: :expired do
70
- let :token_string do
71
- "1A2B3C4DEXP"
72
- end
73
-
74
- let :token do
75
- double(Doorkeeper::AccessToken,
76
- accessible?: false, revoked?: false, expired?: true,
77
- includes_scope?: false, acceptable?: false,
78
- previous_refresh_token: "", revoke_previous_refresh_token!: true)
79
- end
80
-
81
- before :each do
82
- allow(
83
- Doorkeeper::AccessToken
84
- ).to receive(:by_token).with(token_string).and_return(token)
85
- end
86
- end
87
-
88
- shared_context "revoked token", token: :revoked do
89
- let :token_string do
90
- "1A2B3C4DREV"
91
- end
92
-
93
- let :token do
94
- double(Doorkeeper::AccessToken,
95
- accessible?: false, revoked?: true, expired?: false,
96
- includes_scope?: false, acceptable?: false,
97
- previous_refresh_token: "", revoke_previous_refresh_token!: true)
98
- end
99
-
100
- before :each do
101
- allow(
102
- Doorkeeper::AccessToken
103
- ).to receive(:by_token).with(token_string).and_return(token)
104
- end
105
- end
106
-
107
- shared_context "forbidden token", token: :forbidden do
108
- let :token_string do
109
- "1A2B3C4DFORB"
110
- end
111
-
112
- let :token do
113
- double(Doorkeeper::AccessToken,
114
- accessible?: true, includes_scope?: true, acceptable?: false,
115
- previous_refresh_token: "", revoke_previous_refresh_token!: true)
116
- end
117
-
118
- before :each do
119
- allow(
120
- Doorkeeper::AccessToken
121
- ).to receive(:by_token).with(token_string).and_return(token)
122
- end
123
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- shared_context "with token hashing enabled" do
4
- let(:hashed_or_plain_token_func) do
5
- Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
6
- end
7
-
8
- before do
9
- Doorkeeper.configure do
10
- hash_token_secrets
11
- end
12
- end
13
- end
14
-
15
- shared_context "with token hashing and fallback lookup enabled" do
16
- let(:hashed_or_plain_token_func) do
17
- Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
18
- end
19
-
20
- before do
21
- Doorkeeper.configure do
22
- hash_token_secrets fallback: :plain
23
- end
24
- end
25
- end
26
-
27
- shared_context "with application hashing enabled" do
28
- let(:hashed_or_plain_token_func) do
29
- Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
30
- end
31
- before do
32
- Doorkeeper.configure do
33
- hash_application_secrets
34
- end
35
- end
36
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- shared_examples "an accessible token" do
4
- describe :accessible? do
5
- it "is accessible if token is not expired" do
6
- allow(subject).to receive(:expired?).and_return(false)
7
- should be_accessible
8
- end
9
-
10
- it "is not accessible if token is expired" do
11
- allow(subject).to receive(:expired?).and_return(true)
12
- should_not be_accessible
13
- end
14
- end
15
- end
16
-
17
- shared_examples "a revocable token" do
18
- describe :accessible? do
19
- before { subject.save! }
20
-
21
- it "is accessible if token is not revoked" do
22
- expect(subject).to be_accessible
23
- end
24
-
25
- it "is not accessible if token is revoked" do
26
- subject.revoke
27
- expect(subject).not_to be_accessible
28
- end
29
- end
30
- end
31
-
32
- shared_examples "a unique token" do
33
- describe :token do
34
- it "is generated before validation" do
35
- expect { subject.valid? }.to change { subject.token }.from(nil)
36
- end
37
-
38
- it "is not valid if token exists" do
39
- token1 = FactoryBot.create factory_name
40
- token2 = FactoryBot.create factory_name
41
- token2.token = token1.token
42
- expect(token2).not_to be_valid
43
- end
44
-
45
- it "expects database to throw an error when tokens are the same" do
46
- token1 = FactoryBot.create factory_name
47
- token2 = FactoryBot.create factory_name
48
- token2.token = token1.token
49
- expect do
50
- token2.save!(validate: false)
51
- end.to raise_error(uniqueness_error)
52
- end
53
- end
54
- end
@@ -1,158 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe RedirectUriValidator do
6
- subject do
7
- FactoryBot.create(:application)
8
- end
9
-
10
- it "is valid when the uri is a uri" do
11
- subject.redirect_uri = "https://example.com/callback"
12
- expect(subject).to be_valid
13
- end
14
-
15
- # Most mobile and desktop operating systems allow apps to register a custom URL
16
- # scheme that will launch the app when a URL with that scheme is visited from
17
- # the system browser.
18
- #
19
- # @see https://www.oauth.com/oauth2-servers/redirect-uris/redirect-uris-native-apps/
20
- it "is valid when the uri is custom native URI" do
21
- subject.redirect_uri = "myapp://callback"
22
- expect(subject).to be_valid
23
- end
24
-
25
- it "is valid when the uri has a query parameter" do
26
- subject.redirect_uri = "https://example.com/abcd?xyz=123"
27
- expect(subject).to be_valid
28
- end
29
-
30
- it "accepts native redirect uri" do
31
- subject.redirect_uri = "urn:ietf:wg:oauth:2.0:oob"
32
- expect(subject).to be_valid
33
- end
34
-
35
- it "rejects if test uri is disabled" do
36
- allow(RedirectUriValidator).to receive(:native_redirect_uri).and_return(nil)
37
- subject.redirect_uri = "urn:some:test"
38
- expect(subject).not_to be_valid
39
- end
40
-
41
- it "is invalid when the uri is not a uri" do
42
- subject.redirect_uri = "]"
43
- expect(subject).not_to be_valid
44
- expect(subject.errors[:redirect_uri].first).to eq("must be a valid URI.")
45
- end
46
-
47
- it "is invalid when the uri is relative" do
48
- subject.redirect_uri = "/abcd"
49
- expect(subject).not_to be_valid
50
- expect(subject.errors[:redirect_uri].first).to eq("must be an absolute URI.")
51
- end
52
-
53
- it "is invalid when the uri has a fragment" do
54
- subject.redirect_uri = "https://example.com/abcd#xyz"
55
- expect(subject).not_to be_valid
56
- expect(subject.errors[:redirect_uri].first).to eq("cannot contain a fragment.")
57
- end
58
-
59
- context "force secured uri" do
60
- it "accepts an valid uri" do
61
- subject.redirect_uri = "https://example.com/callback"
62
- expect(subject).to be_valid
63
- end
64
-
65
- it "accepts native redirect uri" do
66
- subject.redirect_uri = "urn:ietf:wg:oauth:2.0:oob"
67
- expect(subject).to be_valid
68
- end
69
-
70
- it "accepts app redirect uri" do
71
- subject.redirect_uri = "some-awesome-app://oauth/callback"
72
- expect(subject).to be_valid
73
- end
74
-
75
- it "accepts a non secured protocol when disabled" do
76
- subject.redirect_uri = "http://example.com/callback"
77
- allow(Doorkeeper.configuration).to receive(
78
- :force_ssl_in_redirect_uri
79
- ).and_return(false)
80
- expect(subject).to be_valid
81
- end
82
-
83
- it "accepts a non secured protocol when conditional option defined" do
84
- Doorkeeper.configure do
85
- orm DOORKEEPER_ORM
86
- force_ssl_in_redirect_uri { |uri| uri.host != "localhost" }
87
- end
88
-
89
- application = FactoryBot.build(:application, redirect_uri: "http://localhost/callback")
90
- expect(application).to be_valid
91
-
92
- application = FactoryBot.build(:application, redirect_uri: "https://test.com/callback")
93
- expect(application).to be_valid
94
-
95
- application = FactoryBot.build(:application, redirect_uri: "http://localhost2/callback")
96
- expect(application).not_to be_valid
97
-
98
- application = FactoryBot.build(:application, redirect_uri: "https://test.com/callback")
99
- expect(application).to be_valid
100
- end
101
-
102
- it "forbids redirect uri if required" do
103
- subject.redirect_uri = "javascript://document.cookie"
104
-
105
- Doorkeeper.configure do
106
- orm DOORKEEPER_ORM
107
- forbid_redirect_uri { |uri| uri.scheme == "javascript" }
108
- end
109
-
110
- expect(subject).to be_invalid
111
- expect(subject.errors[:redirect_uri].first).to eq("is forbidden by the server.")
112
-
113
- subject.redirect_uri = "https://localhost/callback"
114
- expect(subject).to be_valid
115
- end
116
-
117
- it "invalidates the uri when the uri does not use a secure protocol" do
118
- subject.redirect_uri = "http://example.com/callback"
119
- expect(subject).not_to be_valid
120
- error = subject.errors[:redirect_uri].first
121
- expect(error).to eq("must be an HTTPS/SSL URI.")
122
- end
123
- end
124
-
125
- context "multiple redirect uri" do
126
- it "invalidates the second uri when the first uri is native uri" do
127
- subject.redirect_uri = "urn:ietf:wg:oauth:2.0:oob\nexample.com/callback"
128
- expect(subject).to be_invalid
129
- end
130
- end
131
-
132
- context "blank redirect URI" do
133
- it "forbids blank redirect uri by default" do
134
- subject.redirect_uri = ""
135
-
136
- expect(subject).to be_invalid
137
- expect(subject.errors[:redirect_uri]).not_to be_blank
138
- end
139
-
140
- it "forbids blank redirect uri by custom condition" do
141
- Doorkeeper.configure do
142
- orm DOORKEEPER_ORM
143
- allow_blank_redirect_uri do |_grant_flows, application|
144
- application.name == "admin app"
145
- end
146
- end
147
-
148
- subject.name = "test app"
149
- subject.redirect_uri = ""
150
-
151
- expect(subject).to be_invalid
152
- expect(subject.errors[:redirect_uri]).not_to be_blank
153
-
154
- subject.name = "admin app"
155
- expect(subject).to be_valid
156
- end
157
- end
158
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::VERSION do
6
- context "#gem_version" do
7
- it "returns Gem::Version instance" do
8
- expect(Doorkeeper.gem_version).to be_an_instance_of(Gem::Version)
9
- end
10
- end
11
-
12
- context "VERSION" do
13
- it "returns gem version string" do
14
- expect(Doorkeeper::VERSION::STRING).to match(/^\d+\.\d+\.\d+(\.\w+)?$/)
15
- end
16
- end
17
- end