doorkeeper 5.4.0.rc1 → 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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +108 -9
  3. data/README.md +4 -4
  4. data/app/controllers/doorkeeper/applications_controller.rb +3 -3
  5. data/app/controllers/doorkeeper/authorizations_controller.rb +16 -5
  6. data/app/controllers/doorkeeper/authorized_applications_controller.rb +1 -1
  7. data/app/controllers/doorkeeper/token_info_controller.rb +12 -2
  8. data/app/controllers/doorkeeper/tokens_controller.rb +34 -26
  9. data/app/views/doorkeeper/applications/_form.html.erb +1 -1
  10. data/app/views/doorkeeper/applications/show.html.erb +16 -12
  11. data/app/views/doorkeeper/authorizations/form_post.html.erb +11 -0
  12. data/config/locales/en.yml +3 -1
  13. data/lib/doorkeeper.rb +6 -1
  14. data/lib/doorkeeper/config.rb +109 -78
  15. data/lib/doorkeeper/config/abstract_builder.rb +1 -1
  16. data/lib/doorkeeper/config/option.rb +1 -3
  17. data/lib/doorkeeper/config/validations.rb +53 -0
  18. data/lib/doorkeeper/engine.rb +1 -1
  19. data/lib/doorkeeper/grant_flow.rb +45 -0
  20. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  21. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  22. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  23. data/lib/doorkeeper/helpers/controller.rb +8 -4
  24. data/lib/doorkeeper/models/access_grant_mixin.rb +12 -7
  25. data/lib/doorkeeper/models/access_token_mixin.rb +12 -8
  26. data/lib/doorkeeper/models/application_mixin.rb +5 -4
  27. data/lib/doorkeeper/models/concerns/revocable.rb +1 -1
  28. data/lib/doorkeeper/oauth/authorization/code.rb +5 -1
  29. data/lib/doorkeeper/oauth/authorization/context.rb +5 -5
  30. data/lib/doorkeeper/oauth/authorization/token.rb +11 -5
  31. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +1 -1
  32. data/lib/doorkeeper/oauth/authorization_code_request.rb +10 -17
  33. data/lib/doorkeeper/oauth/base_request.rb +1 -1
  34. data/lib/doorkeeper/oauth/client_credentials/creator.rb +3 -2
  35. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +1 -0
  36. data/lib/doorkeeper/oauth/client_credentials/validator.rb +3 -1
  37. data/lib/doorkeeper/oauth/code_request.rb +2 -2
  38. data/lib/doorkeeper/oauth/code_response.rb +17 -11
  39. data/lib/doorkeeper/oauth/error_response.rb +4 -3
  40. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +1 -3
  41. data/lib/doorkeeper/oauth/password_access_token_request.rb +21 -2
  42. data/lib/doorkeeper/oauth/pre_authorization.rb +37 -11
  43. data/lib/doorkeeper/oauth/refresh_token_request.rb +13 -0
  44. data/lib/doorkeeper/oauth/token.rb +4 -5
  45. data/lib/doorkeeper/oauth/token_introspection.rb +1 -5
  46. data/lib/doorkeeper/oauth/token_request.rb +1 -1
  47. data/lib/doorkeeper/orm/active_record.rb +5 -6
  48. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +12 -2
  49. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +10 -2
  50. data/lib/doorkeeper/orm/active_record/mixins/application.rb +76 -10
  51. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +5 -0
  52. data/lib/doorkeeper/rails/routes.rb +1 -3
  53. data/lib/doorkeeper/rake/db.rake +3 -3
  54. data/lib/doorkeeper/rake/setup.rake +5 -0
  55. data/lib/doorkeeper/request.rb +49 -12
  56. data/lib/doorkeeper/request/refresh_token.rb +2 -1
  57. data/lib/doorkeeper/server.rb +1 -1
  58. data/lib/doorkeeper/stale_records_cleaner.rb +4 -4
  59. data/lib/doorkeeper/version.rb +2 -6
  60. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +1 -1
  61. data/lib/generators/doorkeeper/templates/initializer.rb +9 -7
  62. data/lib/generators/doorkeeper/templates/migration.rb.erb +12 -5
  63. metadata +25 -306
  64. data/Appraisals +0 -26
  65. data/CODE_OF_CONDUCT.md +0 -46
  66. data/CONTRIBUTING.md +0 -49
  67. data/Dangerfile +0 -67
  68. data/Dockerfile +0 -29
  69. data/Gemfile +0 -25
  70. data/NEWS.md +0 -1
  71. data/RELEASING.md +0 -11
  72. data/Rakefile +0 -28
  73. data/SECURITY.md +0 -15
  74. data/UPGRADE.md +0 -2
  75. data/bin/console +0 -30
  76. data/doorkeeper.gemspec +0 -42
  77. data/gemfiles/rails_5_0.gemfile +0 -19
  78. data/gemfiles/rails_5_1.gemfile +0 -19
  79. data/gemfiles/rails_5_2.gemfile +0 -19
  80. data/gemfiles/rails_6_0.gemfile +0 -19
  81. data/gemfiles/rails_master.gemfile +0 -19
  82. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  83. data/spec/controllers/applications_controller_spec.rb +0 -274
  84. data/spec/controllers/authorizations_controller_spec.rb +0 -743
  85. data/spec/controllers/protected_resources_controller_spec.rb +0 -361
  86. data/spec/controllers/token_info_controller_spec.rb +0 -50
  87. data/spec/controllers/tokens_controller_spec.rb +0 -499
  88. data/spec/dummy/Rakefile +0 -9
  89. data/spec/dummy/app/assets/config/manifest.js +0 -2
  90. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  91. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
  92. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
  93. data/spec/dummy/app/controllers/home_controller.rb +0 -18
  94. data/spec/dummy/app/controllers/metal_controller.rb +0 -13
  95. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
  96. data/spec/dummy/app/helpers/application_helper.rb +0 -7
  97. data/spec/dummy/app/models/user.rb +0 -11
  98. data/spec/dummy/app/views/home/index.html.erb +0 -0
  99. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  100. data/spec/dummy/config.ru +0 -6
  101. data/spec/dummy/config/application.rb +0 -51
  102. data/spec/dummy/config/boot.rb +0 -7
  103. data/spec/dummy/config/database.yml +0 -15
  104. data/spec/dummy/config/environment.rb +0 -5
  105. data/spec/dummy/config/environments/development.rb +0 -31
  106. data/spec/dummy/config/environments/production.rb +0 -64
  107. data/spec/dummy/config/environments/test.rb +0 -45
  108. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
  109. data/spec/dummy/config/initializers/doorkeeper.rb +0 -166
  110. data/spec/dummy/config/initializers/secret_token.rb +0 -10
  111. data/spec/dummy/config/initializers/session_store.rb +0 -10
  112. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  113. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  114. data/spec/dummy/config/routes.rb +0 -13
  115. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  116. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  117. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -69
  118. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  119. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  120. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -8
  121. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -13
  122. data/spec/dummy/db/schema.rb +0 -70
  123. data/spec/dummy/public/404.html +0 -26
  124. data/spec/dummy/public/422.html +0 -26
  125. data/spec/dummy/public/500.html +0 -26
  126. data/spec/dummy/public/favicon.ico +0 -0
  127. data/spec/dummy/script/rails +0 -9
  128. data/spec/factories.rb +0 -30
  129. data/spec/generators/application_owner_generator_spec.rb +0 -28
  130. data/spec/generators/confidential_applications_generator_spec.rb +0 -29
  131. data/spec/generators/enable_polymorphic_resource_owner_generator_spec.rb +0 -47
  132. data/spec/generators/install_generator_spec.rb +0 -36
  133. data/spec/generators/migration_generator_spec.rb +0 -28
  134. data/spec/generators/pkce_generator_spec.rb +0 -28
  135. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
  136. data/spec/generators/templates/routes.rb +0 -4
  137. data/spec/generators/views_generator_spec.rb +0 -29
  138. data/spec/grape/grape_integration_spec.rb +0 -137
  139. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  140. data/spec/lib/config_spec.rb +0 -813
  141. data/spec/lib/doorkeeper_spec.rb +0 -27
  142. data/spec/lib/models/expirable_spec.rb +0 -61
  143. data/spec/lib/models/reusable_spec.rb +0 -40
  144. data/spec/lib/models/revocable_spec.rb +0 -58
  145. data/spec/lib/models/scopes_spec.rb +0 -61
  146. data/spec/lib/models/secret_storable_spec.rb +0 -135
  147. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
  148. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -180
  149. data/spec/lib/oauth/base_request_spec.rb +0 -210
  150. data/spec/lib/oauth/base_response_spec.rb +0 -45
  151. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  152. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -135
  153. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -110
  154. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -57
  155. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  156. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -108
  157. data/spec/lib/oauth/client_spec.rb +0 -38
  158. data/spec/lib/oauth/code_request_spec.rb +0 -46
  159. data/spec/lib/oauth/code_response_spec.rb +0 -36
  160. data/spec/lib/oauth/error_response_spec.rb +0 -64
  161. data/spec/lib/oauth/error_spec.rb +0 -21
  162. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -20
  163. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -110
  164. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  165. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -262
  166. data/spec/lib/oauth/invalid_request_response_spec.rb +0 -73
  167. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -53
  168. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -201
  169. data/spec/lib/oauth/pre_authorization_spec.rb +0 -218
  170. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -166
  171. data/spec/lib/oauth/scopes_spec.rb +0 -146
  172. data/spec/lib/oauth/token_request_spec.rb +0 -164
  173. data/spec/lib/oauth/token_response_spec.rb +0 -84
  174. data/spec/lib/oauth/token_spec.rb +0 -156
  175. data/spec/lib/option_spec.rb +0 -51
  176. data/spec/lib/request/strategy_spec.rb +0 -54
  177. data/spec/lib/secret_storing/base_spec.rb +0 -60
  178. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
  179. data/spec/lib/secret_storing/plain_spec.rb +0 -44
  180. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
  181. data/spec/lib/server_spec.rb +0 -49
  182. data/spec/lib/stale_records_cleaner_spec.rb +0 -102
  183. data/spec/models/doorkeeper/access_grant_spec.rb +0 -175
  184. data/spec/models/doorkeeper/access_token_spec.rb +0 -650
  185. data/spec/models/doorkeeper/application_spec.rb +0 -442
  186. data/spec/requests/applications/applications_request_spec.rb +0 -259
  187. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  188. data/spec/requests/endpoints/authorization_spec.rb +0 -91
  189. data/spec/requests/endpoints/token_spec.rb +0 -79
  190. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -82
  191. data/spec/requests/flows/authorization_code_spec.rb +0 -530
  192. data/spec/requests/flows/client_credentials_spec.rb +0 -207
  193. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -46
  194. data/spec/requests/flows/implicit_grant_spec.rb +0 -91
  195. data/spec/requests/flows/password_spec.rb +0 -316
  196. data/spec/requests/flows/refresh_token_spec.rb +0 -241
  197. data/spec/requests/flows/revoke_token_spec.rb +0 -196
  198. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  199. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  200. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  201. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  202. data/spec/routing/default_routes_spec.rb +0 -41
  203. data/spec/routing/scoped_routes_spec.rb +0 -47
  204. data/spec/spec_helper.rb +0 -54
  205. data/spec/spec_helper_integration.rb +0 -4
  206. data/spec/support/dependencies/factory_bot.rb +0 -4
  207. data/spec/support/doorkeeper_rspec.rb +0 -22
  208. data/spec/support/helpers/access_token_request_helper.rb +0 -14
  209. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  210. data/spec/support/helpers/config_helper.rb +0 -11
  211. data/spec/support/helpers/model_helper.rb +0 -78
  212. data/spec/support/helpers/request_spec_helper.rb +0 -110
  213. data/spec/support/helpers/url_helper.rb +0 -62
  214. data/spec/support/orm/active_record.rb +0 -5
  215. data/spec/support/shared/controllers_shared_context.rb +0 -133
  216. data/spec/support/shared/hashing_shared_context.rb +0 -36
  217. data/spec/support/shared/models_shared_examples.rb +0 -56
  218. data/spec/validators/redirect_uri_validator_spec.rb +0 -183
  219. data/spec/version/version_spec.rb +0 -17
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::OAuth::InvalidTokenResponse do
6
- describe "#name" do
7
- it { expect(subject.name).to eq(:invalid_token) }
8
- end
9
-
10
- describe "#status" do
11
- it { expect(subject.status).to eq(:unauthorized) }
12
- end
13
-
14
- describe ".from_access_token" do
15
- let(:response) { described_class.from_access_token(access_token) }
16
-
17
- context "revoked" do
18
- let(:access_token) { double(revoked?: true, expired?: true) }
19
-
20
- it "sets a description" do
21
- expect(response.description).to include("revoked")
22
- end
23
-
24
- it "sets the reason" do
25
- expect(response.reason).to eq(:revoked)
26
- end
27
- end
28
-
29
- context "expired" do
30
- let(:access_token) { double(revoked?: false, expired?: true) }
31
-
32
- it "sets a description" do
33
- expect(response.description).to include("expired")
34
- end
35
-
36
- it "sets the reason" do
37
- expect(response.reason).to eq(:expired)
38
- end
39
- end
40
-
41
- context "unknown" do
42
- let(:access_token) { double(revoked?: false, expired?: false) }
43
-
44
- it "sets a description" do
45
- expect(response.description).to include("invalid")
46
- end
47
-
48
- it "sets the reason" do
49
- expect(response.reason).to eq(:unknown)
50
- end
51
- end
52
- end
53
- end
@@ -1,201 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::OAuth::PasswordAccessTokenRequest do
6
- let(:server) do
7
- double(
8
- :server,
9
- default_scopes: Doorkeeper::OAuth::Scopes.new,
10
- access_token_expires_in: 2.hours,
11
- refresh_token_enabled?: false,
12
- custom_access_token_expires_in: lambda { |context|
13
- context.grant_type == Doorkeeper::OAuth::PASSWORD ? 1234 : nil
14
- },
15
- )
16
- end
17
- let(:client) { FactoryBot.create(:application) }
18
- let(:owner) { FactoryBot.create(:resource_owner) }
19
-
20
- before do
21
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
22
- end
23
-
24
- subject do
25
- described_class.new(server, client, owner)
26
- end
27
-
28
- it "issues a new token for the client" do
29
- expect do
30
- subject.authorize
31
- end.to change { client.reload.access_tokens.count }.by(1)
32
-
33
- expect(client.reload.access_tokens.max_by(&:created_at).expires_in).to eq(1234)
34
- end
35
-
36
- it "issues a new token without a client" do
37
- subject = described_class.new(server, nil, owner)
38
- expect(subject).to be_valid
39
-
40
- expect do
41
- subject.authorize
42
- end.to change { Doorkeeper::AccessToken.count }.by(1)
43
- end
44
-
45
- it "does not issue a new token with an invalid client" do
46
- subject = described_class.new(server, nil, owner, { client_id: "bad_id" })
47
- expect do
48
- subject.authorize
49
- end.not_to(change { Doorkeeper::AccessToken.count })
50
-
51
- expect(subject.error).to eq(:invalid_client)
52
- end
53
-
54
- it "requires the owner" do
55
- subject = described_class.new(server, client, nil)
56
- subject.validate
57
- expect(subject.error).to eq(:invalid_grant)
58
- end
59
-
60
- it "creates token even when there is already one (default)" do
61
- FactoryBot.create(
62
- :access_token,
63
- application_id: client.id,
64
- resource_owner_id: owner.id,
65
- resource_owner_type: owner.class.name,
66
- )
67
-
68
- expect do
69
- subject.authorize
70
- end.to change { Doorkeeper::AccessToken.count }.by(1)
71
- end
72
-
73
- it "skips token creation if there is already one reusable" do
74
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
75
- FactoryBot.create(
76
- :access_token,
77
- application_id: client.id,
78
- resource_owner_id: owner.id,
79
- resource_owner_type: owner.class.name,
80
- )
81
-
82
- expect do
83
- subject.authorize
84
- end.not_to(change { Doorkeeper::AccessToken.count })
85
- end
86
-
87
- it "creates token when there is already one but non reusable" do
88
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
89
- FactoryBot.create(
90
- :access_token,
91
- application_id: client.id,
92
- resource_owner_id: owner.id,
93
- resource_owner_type: owner.class.name,
94
- )
95
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:reusable?).and_return(false)
96
-
97
- expect do
98
- subject.authorize
99
- end.to change { Doorkeeper::AccessToken.count }.by(1)
100
- end
101
-
102
- it "calls configured request callback methods" do
103
- expect(Doorkeeper.configuration.before_successful_strategy_response)
104
- .to receive(:call).with(subject).once
105
-
106
- expect(Doorkeeper.configuration.after_successful_strategy_response)
107
- .to receive(:call).with(subject, instance_of(Doorkeeper::OAuth::TokenResponse)).once
108
-
109
- subject.authorize
110
- end
111
-
112
- describe "with scopes" do
113
- subject do
114
- described_class.new(server, client, owner, scope: "public")
115
- end
116
-
117
- context "when scopes_by_grant_type is not configured for grant_type" do
118
- it "returns error when scopes are invalid" do
119
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("another"))
120
- subject.validate
121
- expect(subject.error).to eq(:invalid_scope)
122
- end
123
-
124
- it "creates the token with scopes if scopes are valid" do
125
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
126
- expect do
127
- subject.authorize
128
- end.to change { Doorkeeper::AccessToken.count }.by(1)
129
-
130
- expect(Doorkeeper::AccessToken.last.scopes).to include("public")
131
- end
132
- end
133
-
134
- context "when scopes_by_grant_type is configured for grant_type" do
135
- it "returns error when scopes are valid but not permitted for grant_type" do
136
- allow(server)
137
- .to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
138
- allow(Doorkeeper.configuration)
139
- .to receive(:scopes_by_grant_type).and_return(password: "another")
140
- subject.validate
141
- expect(subject.error).to eq(:invalid_scope)
142
- end
143
-
144
- it "creates the token with scopes if scopes are valid and permitted for grant_type" do
145
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
146
- allow(Doorkeeper.configuration)
147
- .to receive(:scopes_by_grant_type).and_return(password: [:public])
148
-
149
- expect do
150
- subject.authorize
151
- end.to change { Doorkeeper::AccessToken.count }.by(1)
152
-
153
- expect(Doorkeeper::AccessToken.last.scopes).to include("public")
154
- end
155
- end
156
- end
157
-
158
- describe "with custom expiry" do
159
- let(:server) do
160
- double(
161
- :server,
162
- default_scopes: Doorkeeper::OAuth::Scopes.new,
163
- access_token_expires_in: 2.hours,
164
- refresh_token_enabled?: false,
165
- custom_access_token_expires_in: lambda { |context|
166
- if context.scopes.exists?("public")
167
- 222
168
- elsif context.scopes.exists?("magic")
169
- Float::INFINITY
170
- end
171
- },
172
- )
173
- end
174
-
175
- before do
176
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
177
- end
178
-
179
- it "checks scopes" do
180
- subject = described_class.new(server, client, owner, scope: "public")
181
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
182
-
183
- expect do
184
- subject.authorize
185
- end.to change { Doorkeeper::AccessToken.count }.by(1)
186
-
187
- expect(Doorkeeper::AccessToken.last.expires_in).to eq(222)
188
- end
189
-
190
- it "falls back to the default otherwise" do
191
- subject = described_class.new(server, client, owner, scope: "private")
192
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("private"))
193
-
194
- expect do
195
- subject.authorize
196
- end.to change { Doorkeeper::AccessToken.count }.by(1)
197
-
198
- expect(Doorkeeper::AccessToken.last.expires_in).to eq(2.hours)
199
- end
200
- end
201
- end
@@ -1,218 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::OAuth::PreAuthorization do
6
- let(:server) do
7
- server = Doorkeeper.configuration
8
- allow(server).to receive(:default_scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("default"))
9
- allow(server).to receive(:optional_scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public profile"))
10
- server
11
- end
12
-
13
- let(:application) { FactoryBot.create(:application, redirect_uri: "https://app.com/callback") }
14
- let(:client) { Doorkeeper::OAuth::Client.find(application.uid) }
15
-
16
- let :attributes do
17
- {
18
- client_id: client.uid,
19
- response_type: "code",
20
- redirect_uri: "https://app.com/callback",
21
- state: "save-this",
22
- current_resource_owner: Object.new,
23
- }
24
- end
25
-
26
- subject do
27
- described_class.new(server, attributes)
28
- end
29
-
30
- it "is authorizable when request is valid" do
31
- expect(subject).to be_authorizable
32
- end
33
-
34
- it "accepts code as response type" do
35
- attributes[:response_type] = "code"
36
- expect(subject).to be_authorizable
37
- end
38
-
39
- it "accepts token as response type" do
40
- allow(server).to receive(:grant_flows).and_return(["implicit"])
41
- attributes[:response_type] = "token"
42
- expect(subject).to be_authorizable
43
- end
44
-
45
- context "when using default grant flows" do
46
- it 'accepts "code" as response type' do
47
- attributes[:response_type] = "code"
48
- expect(subject).to be_authorizable
49
- end
50
-
51
- it 'accepts "token" as response type' do
52
- allow(server).to receive(:grant_flows).and_return(["implicit"])
53
- attributes[:response_type] = "token"
54
- expect(subject).to be_authorizable
55
- end
56
- end
57
-
58
- context "when authorization code grant flow is disabled" do
59
- before do
60
- allow(server).to receive(:grant_flows).and_return(["implicit"])
61
- end
62
-
63
- it 'does not accept "code" as response type' do
64
- attributes[:response_type] = "code"
65
- expect(subject).not_to be_authorizable
66
- end
67
- end
68
-
69
- context "when implicit grant flow is disabled" do
70
- before do
71
- allow(server).to receive(:grant_flows).and_return(["authorization_code"])
72
- end
73
-
74
- it 'does not accept "token" as response type' do
75
- attributes[:response_type] = "token"
76
- expect(subject).not_to be_authorizable
77
- end
78
- end
79
-
80
- context "client application does not restrict valid scopes" do
81
- it "accepts valid scopes" do
82
- attributes[:scope] = "public"
83
- expect(subject).to be_authorizable
84
- end
85
-
86
- it "rejects (globally) non-valid scopes" do
87
- attributes[:scope] = "invalid"
88
- expect(subject).not_to be_authorizable
89
- end
90
-
91
- it "accepts scopes which are permitted for grant_type" do
92
- allow(server).to receive(:scopes_by_grant_type).and_return(authorization_code: [:public])
93
- attributes[:scope] = "public"
94
- expect(subject).to be_authorizable
95
- end
96
-
97
- it "rejects scopes which are not permitted for grant_type" do
98
- allow(server).to receive(:scopes_by_grant_type).and_return(authorization_code: [:profile])
99
- attributes[:scope] = "public"
100
- expect(subject).not_to be_authorizable
101
- end
102
- end
103
-
104
- context "client application restricts valid scopes" do
105
- let(:application) do
106
- FactoryBot.create(:application, scopes: Doorkeeper::OAuth::Scopes.from_string("public nonsense"))
107
- end
108
-
109
- it "accepts valid scopes" do
110
- attributes[:scope] = "public"
111
- expect(subject).to be_authorizable
112
- end
113
-
114
- it "rejects (globally) non-valid scopes" do
115
- attributes[:scope] = "invalid"
116
- expect(subject).not_to be_authorizable
117
- end
118
-
119
- it "rejects (application level) non-valid scopes" do
120
- attributes[:scope] = "profile"
121
- expect(subject).to_not be_authorizable
122
- end
123
-
124
- it "accepts scopes which are permitted for grant_type" do
125
- allow(server).to receive(:scopes_by_grant_type).and_return(authorization_code: [:public])
126
- attributes[:scope] = "public"
127
- expect(subject).to be_authorizable
128
- end
129
-
130
- it "rejects scopes which are not permitted for grant_type" do
131
- allow(server).to receive(:scopes_by_grant_type).and_return(authorization_code: [:profile])
132
- attributes[:scope] = "public"
133
- expect(subject).not_to be_authorizable
134
- end
135
- end
136
-
137
- context "when scope is not provided to pre_authorization" do
138
- before { attributes[:scope] = nil }
139
-
140
- context "when default scopes is provided" do
141
- it "uses default scopes" do
142
- allow(server).to receive(:default_scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("default_scope"))
143
- expect(subject).to be_authorizable
144
- expect(subject.scope).to eq("default_scope")
145
- expect(subject.scopes).to eq(Doorkeeper::OAuth::Scopes.from_string("default_scope"))
146
- end
147
- end
148
-
149
- context "when default scopes is none" do
150
- it "not be authorizable when none default scope" do
151
- allow(server).to receive(:default_scopes).and_return(Doorkeeper::OAuth::Scopes.new)
152
- expect(subject).not_to be_authorizable
153
- end
154
- end
155
- end
156
-
157
- it "matches the redirect uri against client's one" do
158
- attributes[:redirect_uri] = "http://nothesame.com"
159
- expect(subject).not_to be_authorizable
160
- end
161
-
162
- it "stores the state" do
163
- expect(subject.state).to eq("save-this")
164
- end
165
-
166
- it "rejects if response type is not allowed" do
167
- attributes[:response_type] = "whops"
168
- expect(subject).not_to be_authorizable
169
- end
170
-
171
- it "requires an existing client" do
172
- attributes[:client_id] = nil
173
- expect(subject).not_to be_authorizable
174
- end
175
-
176
- it "requires a redirect uri" do
177
- attributes[:redirect_uri] = nil
178
- expect(subject).not_to be_authorizable
179
- end
180
-
181
- context "when resource_owner cannot access client application" do
182
- before { allow(Doorkeeper.configuration).to receive(:authorize_resource_owner_for_client).and_return(->(*_) { false }) }
183
-
184
- it "is not authorizable" do
185
- expect(subject).not_to be_authorizable
186
- end
187
- end
188
-
189
- describe "as_json" do
190
- before { subject.authorizable? }
191
-
192
- it { is_expected.to respond_to :as_json }
193
-
194
- shared_examples "returns the pre authorization" do
195
- it "returns the pre authorization" do
196
- expect(json[:client_id]).to eq client.uid
197
- expect(json[:redirect_uri]).to eq subject.redirect_uri
198
- expect(json[:state]).to eq subject.state
199
- expect(json[:response_type]).to eq subject.response_type
200
- expect(json[:scope]).to eq subject.scope
201
- expect(json[:client_name]).to eq client.name
202
- expect(json[:status]).to eq I18n.t("doorkeeper.pre_authorization.status")
203
- end
204
- end
205
-
206
- context "when called without params" do
207
- let(:json) { subject.as_json }
208
-
209
- include_examples "returns the pre authorization"
210
- end
211
-
212
- context "when called with params" do
213
- let(:json) { subject.as_json(foo: "bar") }
214
-
215
- include_examples "returns the pre authorization"
216
- end
217
- end
218
- end