doorkeeper 5.3.0 → 5.4.0

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