doorkeeper 5.1.0 → 5.5.0

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 (265) hide show
  1. checksums.yaml +4 -4
  2. data/{NEWS.md → CHANGELOG.md} +234 -25
  3. data/README.md +21 -11
  4. data/app/controllers/doorkeeper/application_controller.rb +2 -2
  5. data/app/controllers/doorkeeper/application_metal_controller.rb +3 -2
  6. data/app/controllers/doorkeeper/applications_controller.rb +8 -7
  7. data/app/controllers/doorkeeper/authorizations_controller.rb +56 -19
  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 +93 -25
  11. data/app/views/doorkeeper/applications/_form.html.erb +1 -7
  12. data/app/views/doorkeeper/applications/show.html.erb +35 -14
  13. data/app/views/doorkeeper/authorizations/form_post.html.erb +11 -0
  14. data/config/locales/en.yml +13 -3
  15. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  16. data/lib/doorkeeper/config/option.rb +20 -2
  17. data/lib/doorkeeper/config/validations.rb +53 -0
  18. data/lib/doorkeeper/config.rb +291 -121
  19. data/lib/doorkeeper/engine.rb +1 -1
  20. data/lib/doorkeeper/errors.rb +13 -18
  21. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  22. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  23. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  24. data/lib/doorkeeper/grant_flow.rb +45 -0
  25. data/lib/doorkeeper/grape/helpers.rb +7 -3
  26. data/lib/doorkeeper/helpers/controller.rb +36 -11
  27. data/lib/doorkeeper/models/access_grant_mixin.rb +22 -18
  28. data/lib/doorkeeper/models/access_token_mixin.rb +194 -51
  29. data/lib/doorkeeper/models/application_mixin.rb +8 -7
  30. data/lib/doorkeeper/models/concerns/ownership.rb +1 -1
  31. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  32. data/lib/doorkeeper/models/concerns/reusable.rb +1 -1
  33. data/lib/doorkeeper/models/concerns/revocable.rb +1 -28
  34. data/lib/doorkeeper/models/concerns/scopes.rb +5 -1
  35. data/lib/doorkeeper/models/concerns/secret_storable.rb +1 -3
  36. data/lib/doorkeeper/oauth/authorization/code.rb +25 -14
  37. data/lib/doorkeeper/oauth/authorization/context.rb +5 -5
  38. data/lib/doorkeeper/oauth/authorization/token.rb +24 -19
  39. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +4 -4
  40. data/lib/doorkeeper/oauth/authorization_code_request.rb +40 -21
  41. data/lib/doorkeeper/oauth/base_request.rb +21 -23
  42. data/lib/doorkeeper/oauth/client/credentials.rb +2 -4
  43. data/lib/doorkeeper/oauth/client.rb +8 -9
  44. data/lib/doorkeeper/oauth/client_credentials/creator.rb +45 -5
  45. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +10 -8
  46. data/lib/doorkeeper/oauth/client_credentials/{validation.rb → validator.rb} +13 -3
  47. data/lib/doorkeeper/oauth/client_credentials_request.rb +8 -7
  48. data/lib/doorkeeper/oauth/code_request.rb +6 -12
  49. data/lib/doorkeeper/oauth/code_response.rb +24 -14
  50. data/lib/doorkeeper/oauth/error.rb +1 -1
  51. data/lib/doorkeeper/oauth/error_response.rb +10 -11
  52. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +8 -12
  53. data/lib/doorkeeper/oauth/helpers/unique_token.rb +8 -5
  54. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +19 -5
  55. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  56. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  57. data/lib/doorkeeper/oauth/invalid_token_response.rb +7 -4
  58. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  59. data/lib/doorkeeper/oauth/password_access_token_request.rb +32 -10
  60. data/lib/doorkeeper/oauth/pre_authorization.rb +111 -42
  61. data/lib/doorkeeper/oauth/refresh_token_request.rb +45 -33
  62. data/lib/doorkeeper/oauth/token.rb +6 -7
  63. data/lib/doorkeeper/oauth/token_introspection.rb +24 -18
  64. data/lib/doorkeeper/oauth/token_request.rb +6 -20
  65. data/lib/doorkeeper/oauth/token_response.rb +1 -1
  66. data/lib/doorkeeper/orm/active_record/access_grant.rb +4 -43
  67. data/lib/doorkeeper/orm/active_record/access_token.rb +4 -35
  68. data/lib/doorkeeper/orm/active_record/application.rb +5 -83
  69. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
  70. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
  71. data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
  72. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  73. data/lib/doorkeeper/orm/active_record.rb +20 -6
  74. data/lib/doorkeeper/rails/helpers.rb +4 -4
  75. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  76. data/lib/doorkeeper/rails/routes/mapper.rb +2 -2
  77. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  78. data/lib/doorkeeper/rails/routes.rb +17 -25
  79. data/lib/doorkeeper/rake/db.rake +6 -6
  80. data/lib/doorkeeper/rake/setup.rake +5 -0
  81. data/lib/doorkeeper/request/authorization_code.rb +5 -3
  82. data/lib/doorkeeper/request/client_credentials.rb +2 -2
  83. data/lib/doorkeeper/request/password.rb +2 -2
  84. data/lib/doorkeeper/request/refresh_token.rb +5 -4
  85. data/lib/doorkeeper/request/strategy.rb +2 -2
  86. data/lib/doorkeeper/request.rb +49 -17
  87. data/lib/doorkeeper/server.rb +7 -11
  88. data/lib/doorkeeper/stale_records_cleaner.rb +6 -2
  89. data/lib/doorkeeper/version.rb +1 -5
  90. data/lib/doorkeeper.rb +114 -79
  91. data/lib/generators/doorkeeper/application_owner_generator.rb +1 -1
  92. data/lib/generators/doorkeeper/confidential_applications_generator.rb +2 -2
  93. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  94. data/lib/generators/doorkeeper/migration_generator.rb +1 -1
  95. data/lib/generators/doorkeeper/pkce_generator.rb +1 -1
  96. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +7 -7
  97. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +3 -1
  98. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
  99. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +2 -0
  100. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  101. data/lib/generators/doorkeeper/templates/initializer.rb +205 -43
  102. data/lib/generators/doorkeeper/templates/migration.rb.erb +18 -6
  103. metadata +43 -310
  104. data/.coveralls.yml +0 -1
  105. data/.github/ISSUE_TEMPLATE.md +0 -25
  106. data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  107. data/.gitignore +0 -20
  108. data/.gitlab-ci.yml +0 -16
  109. data/.hound.yml +0 -3
  110. data/.rspec +0 -1
  111. data/.rubocop.yml +0 -50
  112. data/.travis.yml +0 -35
  113. data/Appraisals +0 -40
  114. data/CODE_OF_CONDUCT.md +0 -46
  115. data/CONTRIBUTING.md +0 -47
  116. data/Dangerfile +0 -67
  117. data/Gemfile +0 -24
  118. data/RELEASING.md +0 -10
  119. data/Rakefile +0 -28
  120. data/SECURITY.md +0 -15
  121. data/UPGRADE.md +0 -2
  122. data/app/validators/redirect_uri_validator.rb +0 -50
  123. data/bin/console +0 -16
  124. data/doorkeeper.gemspec +0 -34
  125. data/gemfiles/rails_5_0.gemfile +0 -17
  126. data/gemfiles/rails_5_1.gemfile +0 -17
  127. data/gemfiles/rails_5_2.gemfile +0 -17
  128. data/gemfiles/rails_6_0.gemfile +0 -17
  129. data/gemfiles/rails_master.gemfile +0 -17
  130. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  131. data/spec/controllers/applications_controller_spec.rb +0 -180
  132. data/spec/controllers/authorizations_controller_spec.rb +0 -527
  133. data/spec/controllers/protected_resources_controller_spec.rb +0 -353
  134. data/spec/controllers/token_info_controller_spec.rb +0 -50
  135. data/spec/controllers/tokens_controller_spec.rb +0 -330
  136. data/spec/dummy/Rakefile +0 -9
  137. data/spec/dummy/app/assets/config/manifest.js +0 -2
  138. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  139. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
  140. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
  141. data/spec/dummy/app/controllers/home_controller.rb +0 -18
  142. data/spec/dummy/app/controllers/metal_controller.rb +0 -13
  143. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
  144. data/spec/dummy/app/helpers/application_helper.rb +0 -7
  145. data/spec/dummy/app/models/user.rb +0 -7
  146. data/spec/dummy/app/views/home/index.html.erb +0 -0
  147. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  148. data/spec/dummy/config/application.rb +0 -47
  149. data/spec/dummy/config/boot.rb +0 -7
  150. data/spec/dummy/config/database.yml +0 -15
  151. data/spec/dummy/config/environment.rb +0 -5
  152. data/spec/dummy/config/environments/development.rb +0 -31
  153. data/spec/dummy/config/environments/production.rb +0 -64
  154. data/spec/dummy/config/environments/test.rb +0 -45
  155. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
  156. data/spec/dummy/config/initializers/doorkeeper.rb +0 -121
  157. data/spec/dummy/config/initializers/secret_token.rb +0 -10
  158. data/spec/dummy/config/initializers/session_store.rb +0 -10
  159. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  160. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  161. data/spec/dummy/config/routes.rb +0 -13
  162. data/spec/dummy/config.ru +0 -6
  163. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  164. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  165. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -69
  166. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  167. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  168. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -8
  169. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -13
  170. data/spec/dummy/db/schema.rb +0 -68
  171. data/spec/dummy/public/404.html +0 -26
  172. data/spec/dummy/public/422.html +0 -26
  173. data/spec/dummy/public/500.html +0 -26
  174. data/spec/dummy/public/favicon.ico +0 -0
  175. data/spec/dummy/script/rails +0 -9
  176. data/spec/factories.rb +0 -30
  177. data/spec/generators/application_owner_generator_spec.rb +0 -28
  178. data/spec/generators/confidential_applications_generator_spec.rb +0 -29
  179. data/spec/generators/install_generator_spec.rb +0 -36
  180. data/spec/generators/migration_generator_spec.rb +0 -28
  181. data/spec/generators/pkce_generator_spec.rb +0 -28
  182. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
  183. data/spec/generators/templates/routes.rb +0 -4
  184. data/spec/generators/views_generator_spec.rb +0 -29
  185. data/spec/grape/grape_integration_spec.rb +0 -137
  186. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  187. data/spec/lib/config_spec.rb +0 -697
  188. data/spec/lib/doorkeeper_spec.rb +0 -27
  189. data/spec/lib/models/expirable_spec.rb +0 -61
  190. data/spec/lib/models/reusable_spec.rb +0 -40
  191. data/spec/lib/models/revocable_spec.rb +0 -59
  192. data/spec/lib/models/scopes_spec.rb +0 -53
  193. data/spec/lib/models/secret_storable_spec.rb +0 -135
  194. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
  195. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -156
  196. data/spec/lib/oauth/base_request_spec.rb +0 -205
  197. data/spec/lib/oauth/base_response_spec.rb +0 -47
  198. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  199. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -94
  200. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -112
  201. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -59
  202. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -29
  203. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -109
  204. data/spec/lib/oauth/client_spec.rb +0 -38
  205. data/spec/lib/oauth/code_request_spec.rb +0 -47
  206. data/spec/lib/oauth/code_response_spec.rb +0 -36
  207. data/spec/lib/oauth/error_response_spec.rb +0 -66
  208. data/spec/lib/oauth/error_spec.rb +0 -23
  209. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -22
  210. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -98
  211. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  212. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -247
  213. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -55
  214. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -192
  215. data/spec/lib/oauth/pre_authorization_spec.rb +0 -215
  216. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -177
  217. data/spec/lib/oauth/scopes_spec.rb +0 -148
  218. data/spec/lib/oauth/token_request_spec.rb +0 -150
  219. data/spec/lib/oauth/token_response_spec.rb +0 -86
  220. data/spec/lib/oauth/token_spec.rb +0 -158
  221. data/spec/lib/request/strategy_spec.rb +0 -54
  222. data/spec/lib/secret_storing/base_spec.rb +0 -60
  223. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
  224. data/spec/lib/secret_storing/plain_spec.rb +0 -44
  225. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
  226. data/spec/lib/server_spec.rb +0 -61
  227. data/spec/lib/stale_records_cleaner_spec.rb +0 -89
  228. data/spec/models/doorkeeper/access_grant_spec.rb +0 -144
  229. data/spec/models/doorkeeper/access_token_spec.rb +0 -591
  230. data/spec/models/doorkeeper/application_spec.rb +0 -367
  231. data/spec/requests/applications/applications_request_spec.rb +0 -259
  232. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  233. data/spec/requests/endpoints/authorization_spec.rb +0 -73
  234. data/spec/requests/endpoints/token_spec.rb +0 -75
  235. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -78
  236. data/spec/requests/flows/authorization_code_spec.rb +0 -447
  237. data/spec/requests/flows/client_credentials_spec.rb +0 -128
  238. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -34
  239. data/spec/requests/flows/implicit_grant_spec.rb +0 -90
  240. data/spec/requests/flows/password_spec.rb +0 -259
  241. data/spec/requests/flows/refresh_token_spec.rb +0 -233
  242. data/spec/requests/flows/revoke_token_spec.rb +0 -143
  243. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  244. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  245. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  246. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  247. data/spec/routing/default_routes_spec.rb +0 -41
  248. data/spec/routing/scoped_routes_spec.rb +0 -47
  249. data/spec/spec_helper.rb +0 -57
  250. data/spec/spec_helper_integration.rb +0 -4
  251. data/spec/support/dependencies/factory_bot.rb +0 -4
  252. data/spec/support/doorkeeper_rspec.rb +0 -22
  253. data/spec/support/helpers/access_token_request_helper.rb +0 -13
  254. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  255. data/spec/support/helpers/config_helper.rb +0 -11
  256. data/spec/support/helpers/model_helper.rb +0 -78
  257. data/spec/support/helpers/request_spec_helper.rb +0 -98
  258. data/spec/support/helpers/url_helper.rb +0 -62
  259. data/spec/support/http_method_shim.rb +0 -29
  260. data/spec/support/orm/active_record.rb +0 -5
  261. data/spec/support/shared/controllers_shared_context.rb +0 -123
  262. data/spec/support/shared/hashing_shared_context.rb +0 -36
  263. data/spec/support/shared/models_shared_examples.rb +0 -54
  264. data/spec/validators/redirect_uri_validator_spec.rb +0 -158
  265. data/spec/version/version_spec.rb +0 -17
@@ -1,109 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth
6
- describe ClientCredentialsRequest do
7
- let(:server) do
8
- double(
9
- default_scopes: nil,
10
- access_token_expires_in: 2.hours,
11
- custom_access_token_expires_in: ->(_context) { nil }
12
- )
13
- end
14
-
15
- let(:application) { FactoryBot.create(:application, scopes: "") }
16
- let(:client) { double :client, application: application }
17
- let(:token_creator) { double :issuer, create: true, token: double }
18
-
19
- before do
20
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
21
- end
22
-
23
- subject { ClientCredentialsRequest.new(server, client) }
24
-
25
- before do
26
- subject.issuer = token_creator
27
- end
28
-
29
- it "issues an access token for the current client" do
30
- expect(token_creator).to receive(:create).with(client, nil)
31
- subject.authorize
32
- end
33
-
34
- it "has successful response when issue was created" do
35
- subject.authorize
36
- expect(subject.response).to be_a(TokenResponse)
37
- end
38
-
39
- context "if issue was not created" do
40
- before do
41
- subject.issuer = double create: false, error: :invalid
42
- end
43
-
44
- it "has an error response" do
45
- subject.authorize
46
- expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
47
- end
48
-
49
- it "delegates the error to issuer" do
50
- subject.authorize
51
- expect(subject.error).to eq(:invalid)
52
- end
53
- end
54
-
55
- context "with scopes" do
56
- let(:default_scopes) { Doorkeeper::OAuth::Scopes.from_string("public email") }
57
-
58
- before do
59
- allow(server).to receive(:default_scopes).and_return(default_scopes)
60
- end
61
-
62
- it "issues an access token with default scopes if none was requested" do
63
- expect(token_creator).to receive(:create).with(client, default_scopes)
64
- subject.authorize
65
- end
66
-
67
- it "issues an access token with requested scopes" do
68
- subject = ClientCredentialsRequest.new(server, client, scope: "email")
69
- subject.issuer = token_creator
70
- expect(token_creator).to receive(:create).with(client, Doorkeeper::OAuth::Scopes.from_string("email"))
71
- subject.authorize
72
- end
73
- end
74
-
75
- context "with restricted client" do
76
- let(:default_scopes) do
77
- Doorkeeper::OAuth::Scopes.from_string("public email")
78
- end
79
- let(:server_scopes) do
80
- Doorkeeper::OAuth::Scopes.from_string("public email phone")
81
- end
82
- let(:client_scopes) do
83
- Doorkeeper::OAuth::Scopes.from_string("public phone")
84
- end
85
-
86
- before do
87
- allow(server).to receive(:default_scopes).and_return(default_scopes)
88
- allow(server).to receive(:scopes).and_return(server_scopes)
89
- allow(server).to receive(:access_token_expires_in).and_return(100)
90
- allow(application).to receive(:scopes).and_return(client_scopes)
91
- allow(client).to receive(:id).and_return(nil)
92
- end
93
-
94
- it "delegates the error to issuer if no scope was requested" do
95
- subject = ClientCredentialsRequest.new(server, client)
96
- subject.authorize
97
- expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
98
- expect(subject.error).to eq(:invalid_scope)
99
- end
100
-
101
- it "issues an access token with requested scopes" do
102
- subject = ClientCredentialsRequest.new(server, client, scope: "phone")
103
- subject.authorize
104
- expect(subject.response).to be_a(Doorkeeper::OAuth::TokenResponse)
105
- expect(subject.response.token.scopes_string).to eq("phone")
106
- end
107
- end
108
- end
109
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth
6
- describe Client do
7
- describe :find do
8
- let(:method) { double }
9
-
10
- it "finds the client via uid" do
11
- client = double
12
- expect(method).to receive(:call).with("uid").and_return(client)
13
- expect(Client.find("uid", method)).to be_a(Client)
14
- end
15
-
16
- it "returns nil if client was not found" do
17
- expect(method).to receive(:call).with("uid").and_return(nil)
18
- expect(Client.find("uid", method)).to be_nil
19
- end
20
- end
21
-
22
- describe :authenticate do
23
- it "returns the authenticated client via credentials" do
24
- credentials = Client::Credentials.new("some-uid", "some-secret")
25
- authenticator = double
26
- expect(authenticator).to receive(:call).with("some-uid", "some-secret").and_return(double)
27
- expect(Client.authenticate(credentials, authenticator)).to be_a(Client)
28
- end
29
-
30
- it "returns nil if client was not authenticated" do
31
- credentials = Client::Credentials.new("some-uid", "some-secret")
32
- authenticator = double
33
- expect(authenticator).to receive(:call).with("some-uid", "some-secret").and_return(nil)
34
- expect(Client.authenticate(credentials, authenticator)).to be_nil
35
- end
36
- end
37
- end
38
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth
6
- describe CodeRequest do
7
- let(:pre_auth) do
8
- double(
9
- :pre_auth,
10
- client: double(:application, id: 9990),
11
- redirect_uri: "http://tst.com/cb",
12
- scopes: nil,
13
- state: nil,
14
- error: nil,
15
- authorizable?: true,
16
- code_challenge: nil,
17
- code_challenge_method: nil
18
- )
19
- end
20
-
21
- let(:owner) { double :owner, id: 8900 }
22
-
23
- subject do
24
- CodeRequest.new(pre_auth, owner)
25
- end
26
-
27
- it "creates an access grant" do
28
- expect do
29
- subject.authorize
30
- end.to change { Doorkeeper::AccessGrant.count }.by(1)
31
- end
32
-
33
- it "returns a code response" do
34
- expect(subject.authorize).to be_a(CodeResponse)
35
- end
36
-
37
- it "does not create grant when not authorizable" do
38
- allow(pre_auth).to receive(:authorizable?).and_return(false)
39
- expect { subject.authorize }.not_to(change { Doorkeeper::AccessGrant.count })
40
- end
41
-
42
- it "returns a error response" do
43
- allow(pre_auth).to receive(:authorizable?).and_return(false)
44
- expect(subject.authorize).to be_a(ErrorResponse)
45
- end
46
- end
47
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper
6
- module OAuth
7
- describe CodeResponse do
8
- describe ".redirect_uri" do
9
- context "when generating the redirect URI for an implicit grant" do
10
- let :pre_auth do
11
- double(
12
- :pre_auth,
13
- client: double(:application, id: 1),
14
- redirect_uri: "http://tst.com/cb",
15
- state: nil,
16
- scopes: Scopes.from_string("public")
17
- )
18
- end
19
-
20
- let :auth do
21
- Authorization::Token.new(pre_auth, double(id: 1)).tap do |c|
22
- c.issue_token
23
- allow(c.token).to receive(:expires_in_seconds).and_return(3600)
24
- end
25
- end
26
-
27
- subject { CodeResponse.new(pre_auth, auth, response_on_fragment: true).redirect_uri }
28
-
29
- it "includes the remaining TTL of the token relative to the time the token was generated" do
30
- expect(subject).to include("expires_in=3600")
31
- end
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth
6
- describe ErrorResponse do
7
- describe "#status" do
8
- it "should have a status of bad_request" do
9
- expect(subject.status).to eq(:bad_request)
10
- end
11
-
12
- it "should have a status of unauthorized for an invalid_client error" do
13
- subject = described_class.new(name: :invalid_client)
14
-
15
- expect(subject.status).to eq(:unauthorized)
16
- end
17
- end
18
-
19
- describe :from_request do
20
- it "has the error from request" do
21
- error = ErrorResponse.from_request double(error: :some_error)
22
- expect(error.name).to eq(:some_error)
23
- end
24
-
25
- it "ignores state if request does not respond to state" do
26
- error = ErrorResponse.from_request double(error: :some_error)
27
- expect(error.state).to be_nil
28
- end
29
-
30
- it "has state if request responds to state" do
31
- error = ErrorResponse.from_request double(error: :some_error, state: :hello)
32
- expect(error.state).to eq(:hello)
33
- end
34
- end
35
-
36
- it "ignores empty error values" do
37
- subject = ErrorResponse.new(error: :some_error, state: nil)
38
- expect(subject.body).not_to have_key(:state)
39
- end
40
-
41
- describe ".body" do
42
- subject { ErrorResponse.new(name: :some_error, state: :some_state).body }
43
-
44
- describe "#body" do
45
- it { expect(subject).to have_key(:error) }
46
- it { expect(subject).to have_key(:error_description) }
47
- it { expect(subject).to have_key(:state) }
48
- end
49
- end
50
-
51
- describe ".headers" do
52
- let(:error_response) { ErrorResponse.new(name: :some_error, state: :some_state) }
53
- subject { error_response.headers }
54
-
55
- it { expect(subject).to include "WWW-Authenticate" }
56
-
57
- describe "WWW-Authenticate header" do
58
- subject { error_response.headers["WWW-Authenticate"] }
59
-
60
- it { expect(subject).to include("realm=\"#{error_response.realm}\"") }
61
- it { expect(subject).to include("error=\"#{error_response.name}\"") }
62
- it { expect(subject).to include("error_description=\"#{error_response.description}\"") }
63
- end
64
- end
65
- end
66
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth
6
- describe Error do
7
- subject(:error) { Error.new(:some_error, :some_state) }
8
-
9
- it { expect(subject).to respond_to(:name) }
10
- it { expect(subject).to respond_to(:state) }
11
-
12
- describe :description do
13
- it "is translated from translation messages" do
14
- expect(I18n).to receive(:translate).with(
15
- :some_error,
16
- scope: %i[doorkeeper errors messages],
17
- default: :server_error
18
- )
19
- error.description
20
- end
21
- end
22
- end
23
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth
6
- describe ForbiddenTokenResponse do
7
- describe "#name" do
8
- it { expect(subject.name).to eq(:invalid_scope) }
9
- end
10
-
11
- describe "#status" do
12
- it { expect(subject.status).to eq(:forbidden) }
13
- end
14
-
15
- describe :from_scopes do
16
- it "should have a list of acceptable scopes" do
17
- response = ForbiddenTokenResponse.from_scopes(["public"])
18
- expect(response.description).to include("public")
19
- end
20
- end
21
- end
22
- end
@@ -1,98 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth::Helpers
6
- describe ScopeChecker, ".valid?" do
7
- let(:server_scopes) { Doorkeeper::OAuth::Scopes.new }
8
-
9
- it "is valid if scope is present" do
10
- server_scopes.add :scope
11
- expect(ScopeChecker.valid?(scope_str: "scope", server_scopes: server_scopes)).to be_truthy
12
- end
13
-
14
- it "is invalid if includes tabs space" do
15
- expect(ScopeChecker.valid?(scope_str: "\tsomething", server_scopes: server_scopes)).to be_falsey
16
- end
17
-
18
- it "is invalid if scope is not present" do
19
- expect(ScopeChecker.valid?(scope_str: nil, server_scopes: server_scopes)).to be_falsey
20
- end
21
-
22
- it "is invalid if scope is blank" do
23
- expect(ScopeChecker.valid?(scope_str: " ", server_scopes: server_scopes)).to be_falsey
24
- end
25
-
26
- it "is invalid if includes return space" do
27
- expect(ScopeChecker.valid?(scope_str: "scope\r", server_scopes: server_scopes)).to be_falsey
28
- end
29
-
30
- it "is invalid if includes new lines" do
31
- expect(ScopeChecker.valid?(scope_str: "scope\nanother", server_scopes: server_scopes)).to be_falsey
32
- end
33
-
34
- it "is invalid if any scope is not included in server scopes" do
35
- expect(ScopeChecker.valid?(scope_str: "scope another", server_scopes: server_scopes)).to be_falsey
36
- end
37
-
38
- context "with application_scopes" do
39
- let(:server_scopes) do
40
- Doorkeeper::OAuth::Scopes.from_string "common svr"
41
- end
42
- let(:application_scopes) do
43
- Doorkeeper::OAuth::Scopes.from_string "app123"
44
- end
45
-
46
- it "is valid if scope is included in the application scope list" do
47
- expect(ScopeChecker.valid?(scope_str: "app123",
48
- server_scopes: server_scopes,
49
- app_scopes: application_scopes)).to be_truthy
50
- end
51
-
52
- it "is invalid if any scope is not included in the application" do
53
- expect(ScopeChecker.valid?(scope_str: "svr",
54
- server_scopes: server_scopes,
55
- app_scopes: application_scopes)).to be_falsey
56
- end
57
- end
58
-
59
- context "with grant_type" do
60
- let(:server_scopes) do
61
- Doorkeeper::OAuth::Scopes.from_string "scope1 scope2"
62
- end
63
-
64
- context "with scopes_by_grant_type not configured for grant_type" do
65
- it "is valid if the scope is in server scopes" do
66
- expect(ScopeChecker.valid?(scope_str: "scope1",
67
- server_scopes: server_scopes,
68
- grant_type: Doorkeeper::OAuth::PASSWORD)).to be_truthy
69
- end
70
-
71
- it "is invalid if the scope is not in server scopes" do
72
- expect(ScopeChecker.valid?(scope_str: "unknown",
73
- server_scopes: server_scopes,
74
- grant_type: Doorkeeper::OAuth::PASSWORD)).to be_falsey
75
- end
76
- end
77
-
78
- context "when scopes_by_grant_type configured for grant_type" do
79
- before do
80
- allow(Doorkeeper.configuration).to receive(:scopes_by_grant_type)
81
- .and_return(password: [:scope1])
82
- end
83
-
84
- it "is valid if the scope is permitted for grant_type" do
85
- expect(ScopeChecker.valid?(scope_str: "scope1",
86
- server_scopes: server_scopes,
87
- grant_type: Doorkeeper::OAuth::PASSWORD)).to be_truthy
88
- end
89
-
90
- it "is invalid if the scope is permitted for grant_type" do
91
- expect(ScopeChecker.valid?(scope_str: "scope2",
92
- server_scopes: server_scopes,
93
- grant_type: Doorkeeper::OAuth::PASSWORD)).to be_falsey
94
- end
95
- end
96
- end
97
- end
98
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth::Helpers
6
- describe UniqueToken do
7
- let :generator do
8
- ->(size) { "a" * size }
9
- end
10
-
11
- it "is able to customize the generator method" do
12
- token = UniqueToken.generate(generator: generator)
13
- expect(token).to eq("a" * 32)
14
- end
15
-
16
- it "is able to customize the size of the token" do
17
- token = UniqueToken.generate(generator: generator, size: 2)
18
- expect(token).to eq("aa")
19
- end
20
- end
21
- end