doorkeeper 5.3.3 → 5.4.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 (224) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +82 -4
  3. data/README.md +6 -4
  4. data/app/controllers/doorkeeper/applications_controller.rb +4 -4
  5. data/app/controllers/doorkeeper/authorizations_controller.rb +31 -12
  6. data/app/controllers/doorkeeper/authorized_applications_controller.rb +2 -2
  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 +64 -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 +108 -45
  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.rb +10 -2
  52. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  53. data/lib/doorkeeper/rails/routes/mapper.rb +2 -2
  54. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  55. data/lib/doorkeeper/rails/routes.rb +13 -17
  56. data/lib/doorkeeper/request/refresh_token.rb +2 -1
  57. data/lib/doorkeeper/request/strategy.rb +2 -2
  58. data/lib/doorkeeper/server.rb +4 -4
  59. data/lib/doorkeeper/stale_records_cleaner.rb +4 -4
  60. data/lib/doorkeeper/version.rb +2 -2
  61. data/lib/doorkeeper.rb +106 -79
  62. data/lib/generators/doorkeeper/confidential_applications_generator.rb +1 -1
  63. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  64. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +2 -0
  65. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
  66. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +2 -0
  67. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  68. data/lib/generators/doorkeeper/templates/initializer.rb +39 -3
  69. data/lib/generators/doorkeeper/templates/migration.rb.erb +14 -5
  70. metadata +13 -296
  71. data/Appraisals +0 -40
  72. data/CODE_OF_CONDUCT.md +0 -46
  73. data/CONTRIBUTING.md +0 -49
  74. data/Dangerfile +0 -67
  75. data/Dockerfile +0 -29
  76. data/Gemfile +0 -25
  77. data/NEWS.md +0 -1
  78. data/RELEASING.md +0 -11
  79. data/Rakefile +0 -28
  80. data/SECURITY.md +0 -15
  81. data/UPGRADE.md +0 -2
  82. data/bin/console +0 -16
  83. data/doorkeeper.gemspec +0 -42
  84. data/gemfiles/rails_5_0.gemfile +0 -18
  85. data/gemfiles/rails_5_1.gemfile +0 -18
  86. data/gemfiles/rails_5_2.gemfile +0 -18
  87. data/gemfiles/rails_6_0.gemfile +0 -18
  88. data/gemfiles/rails_master.gemfile +0 -18
  89. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  90. data/spec/controllers/applications_controller_spec.rb +0 -274
  91. data/spec/controllers/authorizations_controller_spec.rb +0 -608
  92. data/spec/controllers/protected_resources_controller_spec.rb +0 -361
  93. data/spec/controllers/token_info_controller_spec.rb +0 -50
  94. data/spec/controllers/tokens_controller_spec.rb +0 -498
  95. data/spec/dummy/Rakefile +0 -9
  96. data/spec/dummy/app/assets/config/manifest.js +0 -2
  97. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  98. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
  99. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
  100. data/spec/dummy/app/controllers/home_controller.rb +0 -18
  101. data/spec/dummy/app/controllers/metal_controller.rb +0 -13
  102. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
  103. data/spec/dummy/app/helpers/application_helper.rb +0 -7
  104. data/spec/dummy/app/models/user.rb +0 -7
  105. data/spec/dummy/app/views/home/index.html.erb +0 -0
  106. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  107. data/spec/dummy/config/application.rb +0 -49
  108. data/spec/dummy/config/boot.rb +0 -7
  109. data/spec/dummy/config/database.yml +0 -15
  110. data/spec/dummy/config/environment.rb +0 -5
  111. data/spec/dummy/config/environments/development.rb +0 -31
  112. data/spec/dummy/config/environments/production.rb +0 -64
  113. data/spec/dummy/config/environments/test.rb +0 -45
  114. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
  115. data/spec/dummy/config/initializers/doorkeeper.rb +0 -166
  116. data/spec/dummy/config/initializers/secret_token.rb +0 -10
  117. data/spec/dummy/config/initializers/session_store.rb +0 -10
  118. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  119. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  120. data/spec/dummy/config/routes.rb +0 -13
  121. data/spec/dummy/config.ru +0 -6
  122. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  123. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  124. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -69
  125. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  126. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  127. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -8
  128. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -13
  129. data/spec/dummy/db/schema.rb +0 -68
  130. data/spec/dummy/public/404.html +0 -26
  131. data/spec/dummy/public/422.html +0 -26
  132. data/spec/dummy/public/500.html +0 -26
  133. data/spec/dummy/public/favicon.ico +0 -0
  134. data/spec/dummy/script/rails +0 -9
  135. data/spec/factories.rb +0 -30
  136. data/spec/generators/application_owner_generator_spec.rb +0 -28
  137. data/spec/generators/confidential_applications_generator_spec.rb +0 -29
  138. data/spec/generators/install_generator_spec.rb +0 -36
  139. data/spec/generators/migration_generator_spec.rb +0 -28
  140. data/spec/generators/pkce_generator_spec.rb +0 -28
  141. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
  142. data/spec/generators/templates/routes.rb +0 -4
  143. data/spec/generators/views_generator_spec.rb +0 -29
  144. data/spec/grape/grape_integration_spec.rb +0 -137
  145. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  146. data/spec/lib/config_spec.rb +0 -809
  147. data/spec/lib/doorkeeper_spec.rb +0 -27
  148. data/spec/lib/models/expirable_spec.rb +0 -61
  149. data/spec/lib/models/reusable_spec.rb +0 -40
  150. data/spec/lib/models/revocable_spec.rb +0 -59
  151. data/spec/lib/models/scopes_spec.rb +0 -53
  152. data/spec/lib/models/secret_storable_spec.rb +0 -135
  153. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
  154. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -170
  155. data/spec/lib/oauth/base_request_spec.rb +0 -224
  156. data/spec/lib/oauth/base_response_spec.rb +0 -45
  157. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  158. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -134
  159. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -112
  160. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -59
  161. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  162. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -107
  163. data/spec/lib/oauth/client_spec.rb +0 -38
  164. data/spec/lib/oauth/code_request_spec.rb +0 -46
  165. data/spec/lib/oauth/code_response_spec.rb +0 -32
  166. data/spec/lib/oauth/error_response_spec.rb +0 -64
  167. data/spec/lib/oauth/error_spec.rb +0 -21
  168. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -20
  169. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -110
  170. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  171. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -262
  172. data/spec/lib/oauth/invalid_request_response_spec.rb +0 -73
  173. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -53
  174. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -190
  175. data/spec/lib/oauth/pre_authorization_spec.rb +0 -223
  176. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -177
  177. data/spec/lib/oauth/scopes_spec.rb +0 -146
  178. data/spec/lib/oauth/token_request_spec.rb +0 -157
  179. data/spec/lib/oauth/token_response_spec.rb +0 -84
  180. data/spec/lib/oauth/token_spec.rb +0 -156
  181. data/spec/lib/request/strategy_spec.rb +0 -54
  182. data/spec/lib/secret_storing/base_spec.rb +0 -60
  183. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
  184. data/spec/lib/secret_storing/plain_spec.rb +0 -44
  185. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
  186. data/spec/lib/server_spec.rb +0 -49
  187. data/spec/lib/stale_records_cleaner_spec.rb +0 -89
  188. data/spec/models/doorkeeper/access_grant_spec.rb +0 -161
  189. data/spec/models/doorkeeper/access_token_spec.rb +0 -622
  190. data/spec/models/doorkeeper/application_spec.rb +0 -482
  191. data/spec/requests/applications/applications_request_spec.rb +0 -259
  192. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  193. data/spec/requests/endpoints/authorization_spec.rb +0 -91
  194. data/spec/requests/endpoints/token_spec.rb +0 -75
  195. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -79
  196. data/spec/requests/flows/authorization_code_spec.rb +0 -525
  197. data/spec/requests/flows/client_credentials_spec.rb +0 -166
  198. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -46
  199. data/spec/requests/flows/implicit_grant_spec.rb +0 -91
  200. data/spec/requests/flows/password_spec.rb +0 -316
  201. data/spec/requests/flows/refresh_token_spec.rb +0 -233
  202. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  203. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  204. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  205. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  206. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  207. data/spec/routing/default_routes_spec.rb +0 -41
  208. data/spec/routing/scoped_routes_spec.rb +0 -47
  209. data/spec/spec_helper.rb +0 -54
  210. data/spec/spec_helper_integration.rb +0 -4
  211. data/spec/support/dependencies/factory_bot.rb +0 -4
  212. data/spec/support/doorkeeper_rspec.rb +0 -22
  213. data/spec/support/helpers/access_token_request_helper.rb +0 -13
  214. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  215. data/spec/support/helpers/config_helper.rb +0 -11
  216. data/spec/support/helpers/model_helper.rb +0 -78
  217. data/spec/support/helpers/request_spec_helper.rb +0 -110
  218. data/spec/support/helpers/url_helper.rb +0 -62
  219. data/spec/support/orm/active_record.rb +0 -5
  220. data/spec/support/shared/controllers_shared_context.rb +0 -133
  221. data/spec/support/shared/hashing_shared_context.rb +0 -36
  222. data/spec/support/shared/models_shared_examples.rb +0 -54
  223. data/spec/validators/redirect_uri_validator_spec.rb +0 -183
  224. data/spec/version/version_spec.rb +0 -17
@@ -1,262 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- module Doorkeeper::OAuth::Helpers
6
- describe URIChecker do
7
- describe ".valid?" do
8
- it "is valid for valid uris" do
9
- uri = "http://app.co"
10
- expect(URIChecker.valid?(uri)).to be_truthy
11
- end
12
-
13
- it "is valid if include path param" do
14
- uri = "http://app.co/path"
15
- expect(URIChecker.valid?(uri)).to be_truthy
16
- end
17
-
18
- it "is valid if include query param" do
19
- uri = "http://app.co/?query=1"
20
- expect(URIChecker.valid?(uri)).to be_truthy
21
- end
22
-
23
- it "is invalid if uri includes fragment" do
24
- uri = "http://app.co/test#fragment"
25
- expect(URIChecker.valid?(uri)).to be_falsey
26
- end
27
-
28
- it "is invalid if scheme is missing" do
29
- uri = "app.co"
30
- expect(URIChecker.valid?(uri)).to be_falsey
31
- end
32
-
33
- it "is invalid if is a relative uri" do
34
- uri = "/abc/123"
35
- expect(URIChecker.valid?(uri)).to be_falsey
36
- end
37
-
38
- it "is invalid if is not a url" do
39
- uri = "http://"
40
- expect(URIChecker.valid?(uri)).to be_falsey
41
- end
42
-
43
- it "is invalid if localhost is resolved as as scheme (no scheme specified)" do
44
- uri = "localhost:8080"
45
- expect(URIChecker.valid?(uri)).to be_falsey
46
- end
47
-
48
- it "is invalid if scheme is missing #2" do
49
- uri = "app.co:80"
50
- expect(URIChecker.valid?(uri)).to be_falsey
51
- end
52
-
53
- it "is invalid if is not an uri" do
54
- uri = " "
55
- expect(URIChecker.valid?(uri)).to be_falsey
56
- end
57
-
58
- it "is valid for custom schemes" do
59
- uri = "com.example.app:/test"
60
- expect(URIChecker.valid?(uri)).to be_truthy
61
- end
62
-
63
- it "is valid for custom schemes with authority marker (common misconfiguration)" do
64
- uri = "com.example.app://test"
65
- expect(URIChecker.valid?(uri)).to be_truthy
66
- end
67
- end
68
-
69
- describe ".matches?" do
70
- it "is true if both url matches" do
71
- uri = client_uri = "http://app.co/aaa"
72
- expect(URIChecker.matches?(uri, client_uri)).to be_truthy
73
- end
74
-
75
- it "ignores query parameter on comparsion" do
76
- uri = "http://app.co/?query=hello"
77
- client_uri = "http://app.co"
78
- expect(URIChecker.matches?(uri, client_uri)).to be_truthy
79
- end
80
-
81
- it "doesn't allow non-matching domains through" do
82
- uri = "http://app.abc/?query=hello"
83
- client_uri = "http://app.co"
84
- expect(URIChecker.matches?(uri, client_uri)).to be_falsey
85
- end
86
-
87
- it "doesn't allow non-matching domains that don't start at the beginning" do
88
- uri = "http://app.co/?query=hello"
89
- client_uri = "http://example.com?app.co=test"
90
- expect(URIChecker.matches?(uri, client_uri)).to be_falsey
91
- end
92
-
93
- context "loopback IP redirect URIs" do
94
- it "ignores port for same URIs" do
95
- uri = "http://127.0.0.1:5555/auth/callback"
96
- client_uri = "http://127.0.0.1:48599/auth/callback"
97
- expect(URIChecker.matches?(uri, client_uri)).to be_truthy
98
-
99
- uri = "http://[::1]:5555/auth/callback"
100
- client_uri = "http://[::1]:5555/auth/callback"
101
- expect(URIChecker.matches?(uri, client_uri)).to be_truthy
102
- end
103
-
104
- it "doesn't ignore port for URIs with different queries" do
105
- uri = "http://127.0.0.1:5555/auth/callback"
106
- client_uri = "http://127.0.0.1:48599/auth/callback2"
107
- expect(URIChecker.matches?(uri, client_uri)).to be_falsey
108
- end
109
- end
110
-
111
- context "client registered query params" do
112
- it "doesn't allow query being absent" do
113
- uri = "http://app.co"
114
- client_uri = "http://app.co/?vendorId=AJ4L7XXW9"
115
- expect(URIChecker.matches?(uri, client_uri)).to be_falsey
116
- end
117
-
118
- it "is false if query values differ but key same" do
119
- uri = "http://app.co/?vendorId=pancakes"
120
- client_uri = "http://app.co/?vendorId=waffles"
121
- expect(URIChecker.matches?(uri, client_uri)).to be_falsey
122
- end
123
-
124
- it "is false if query values same but key differs" do
125
- uri = "http://app.co/?foo=pancakes"
126
- client_uri = "http://app.co/?bar=pancakes"
127
- expect(URIChecker.matches?(uri, client_uri)).to be_falsey
128
- end
129
-
130
- it "is false if query present and match, but unknown queries present" do
131
- uri = "http://app.co/?vendorId=pancakes&unknown=query"
132
- client_uri = "http://app.co/?vendorId=waffles"
133
- expect(URIChecker.matches?(uri, client_uri)).to be_falsey
134
- end
135
-
136
- it "is true if queries are present and matche" do
137
- uri = "http://app.co/?vendorId=AJ4L7XXW9&foo=bar"
138
- client_uri = "http://app.co/?vendorId=AJ4L7XXW9&foo=bar"
139
- expect(URIChecker.matches?(uri, client_uri)).to be_truthy
140
- end
141
-
142
- it "is true if queries are present, match and in different order" do
143
- uri = "http://app.co/?bing=bang&foo=bar"
144
- client_uri = "http://app.co/?foo=bar&bing=bang"
145
- expect(URIChecker.matches?(uri, client_uri)).to be_truthy
146
- end
147
- end
148
- end
149
-
150
- describe ".valid_for_authorization?" do
151
- it "is true if valid and matches" do
152
- uri = client_uri = "http://app.co/aaa"
153
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_truthy
154
-
155
- uri = client_uri = "http://app.co/aaa?b=c"
156
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_truthy
157
- end
158
-
159
- it "is true if uri includes blank query" do
160
- uri = client_uri = "http://app.co/aaa?"
161
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_truthy
162
-
163
- uri = "http://app.co/aaa?"
164
- client_uri = "http://app.co/aaa"
165
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_truthy
166
-
167
- uri = "http://app.co/aaa"
168
- client_uri = "http://app.co/aaa?"
169
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_truthy
170
- end
171
-
172
- it "is false if valid and mismatches" do
173
- uri = "http://app.co/aaa"
174
- client_uri = "http://app.co/bbb"
175
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_falsey
176
- end
177
-
178
- it "is true if valid and included in array" do
179
- uri = "http://app.co/aaa"
180
- client_uri = "http://example.com/bbb\nhttp://app.co/aaa"
181
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_truthy
182
- end
183
-
184
- it "is false if valid and not included in array" do
185
- uri = "http://app.co/aaa"
186
- client_uri = "http://example.com/bbb\nhttp://app.co/cc"
187
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_falsey
188
- end
189
-
190
- it "is false if queries does not match" do
191
- uri = "http://app.co/aaa?pankcakes=abc"
192
- client_uri = "http://app.co/aaa?waffles=abc"
193
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be false
194
- end
195
-
196
- it "calls .matches?" do
197
- uri = "http://app.co/aaa?pankcakes=abc"
198
- client_uri = "http://app.co/aaa?waffles=abc"
199
- expect(URIChecker).to receive(:matches?).with(uri, client_uri).once
200
- URIChecker.valid_for_authorization?(uri, client_uri)
201
- end
202
-
203
- it "calls .valid?" do
204
- uri = "http://app.co/aaa?pankcakes=abc"
205
- client_uri = "http://app.co/aaa?waffles=abc"
206
- expect(URIChecker).to receive(:valid?).with(uri).once
207
- URIChecker.valid_for_authorization?(uri, client_uri)
208
- end
209
- end
210
-
211
- describe ".query_matches?" do
212
- it "is true if no queries" do
213
- expect(URIChecker.query_matches?("", "")).to be_truthy
214
- expect(URIChecker.query_matches?(nil, nil)).to be_truthy
215
- end
216
-
217
- it "is true if same query" do
218
- expect(URIChecker.query_matches?("foo", "foo")).to be_truthy
219
- end
220
-
221
- it "is false if different query" do
222
- expect(URIChecker.query_matches?("foo", "bar")).to be_falsey
223
- end
224
-
225
- it "is true if same queries" do
226
- expect(URIChecker.query_matches?("foo&bar", "foo&bar")).to be_truthy
227
- end
228
-
229
- it "is true if same queries, different order" do
230
- expect(URIChecker.query_matches?("foo&bar", "bar&foo")).to be_truthy
231
- end
232
-
233
- it "is false if one different query" do
234
- expect(URIChecker.query_matches?("foo&bang", "foo&bing")).to be_falsey
235
- end
236
-
237
- it "is true if same query with same value" do
238
- expect(URIChecker.query_matches?("foo=bar", "foo=bar")).to be_truthy
239
- end
240
-
241
- it "is true if same queries with same values" do
242
- expect(URIChecker.query_matches?("foo=bar&bing=bang", "foo=bar&bing=bang")).to be_truthy
243
- end
244
-
245
- it "is true if same queries with same values, different order" do
246
- expect(URIChecker.query_matches?("foo=bar&bing=bang", "bing=bang&foo=bar")).to be_truthy
247
- end
248
-
249
- it "is false if same query with different value" do
250
- expect(URIChecker.query_matches?("foo=bar", "foo=bang")).to be_falsey
251
- end
252
-
253
- it "is false if some queries missing" do
254
- expect(URIChecker.query_matches?("foo=bar", "foo=bar&bing=bang")).to be_falsey
255
- end
256
-
257
- it "is false if some queries different value" do
258
- expect(URIChecker.query_matches?("foo=bar&bing=bang", "foo=bar&bing=banana")).to be_falsey
259
- end
260
- end
261
- end
262
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Doorkeeper::OAuth::InvalidRequestResponse do
6
- describe "#name" do
7
- it { expect(subject.name).to eq(:invalid_request) }
8
- end
9
-
10
- describe "#status" do
11
- it { expect(subject.status).to eq(:bad_request) }
12
- end
13
-
14
- describe ".from_request" do
15
- let(:response) { described_class.from_request(request) }
16
-
17
- context "missing param" do
18
- let(:request) { double(missing_param: "some_param") }
19
-
20
- it "sets a description" do
21
- expect(response.description).to eq(
22
- I18n.t(:missing_param, scope: %i[doorkeeper errors messages invalid_request], value: "some_param"),
23
- )
24
- end
25
-
26
- it "sets the reason" do
27
- expect(response.reason).to eq(:missing_param)
28
- end
29
- end
30
-
31
- context "server doesn't support_pkce" do
32
- let(:request) { double(invalid_request_reason: :not_support_pkce) }
33
-
34
- it "sets a description" do
35
- expect(response.description).to eq(
36
- I18n.t(:not_support_pkce, scope: %i[doorkeeper errors messages invalid_request]),
37
- )
38
- end
39
-
40
- it "sets the reason" do
41
- expect(response.reason).to eq(:not_support_pkce)
42
- end
43
- end
44
-
45
- context "request is not authorized" do
46
- let(:request) { double(invalid_request_reason: :request_not_authorized) }
47
-
48
- it "sets a description" do
49
- expect(response.description).to eq(
50
- I18n.t(:request_not_authorized, scope: %i[doorkeeper errors messages invalid_request]),
51
- )
52
- end
53
-
54
- it "sets the reason" do
55
- expect(response.reason).to eq(:request_not_authorized)
56
- end
57
- end
58
-
59
- context "unknown reason" do
60
- let(:request) { double(invalid_request_reason: :unknown_reason) }
61
-
62
- it "sets a description" do
63
- expect(response.description).to eq(
64
- I18n.t(:unknown, scope: %i[doorkeeper errors messages invalid_request]),
65
- )
66
- end
67
-
68
- it "unknown reason" do
69
- expect(response.reason).to eq(:unknown_reason)
70
- end
71
- end
72
- end
73
- end
@@ -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,190 +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) { double :owner, id: 99 }
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
- expect do
38
- subject.client = nil
39
- subject.authorize
40
- end.to change { Doorkeeper::AccessToken.count }.by(1)
41
- end
42
-
43
- it "does not issue a new token with an invalid client" do
44
- expect do
45
- subject.client = nil
46
- subject.parameters = { client_id: "bad_id" }
47
- subject.authorize
48
- end.not_to(change { Doorkeeper::AccessToken.count })
49
-
50
- expect(subject.error).to eq(:invalid_client)
51
- end
52
-
53
- it "requires the owner" do
54
- subject.resource_owner = nil
55
- subject.validate
56
- expect(subject.error).to eq(:invalid_grant)
57
- end
58
-
59
- it "optionally accepts the client" do
60
- subject.client = nil
61
- expect(subject).to be_valid
62
- end
63
-
64
- it "creates token even when there is already one (default)" do
65
- FactoryBot.create(:access_token, application_id: client.id, resource_owner_id: owner.id)
66
-
67
- expect do
68
- subject.authorize
69
- end.to change { Doorkeeper::AccessToken.count }.by(1)
70
- end
71
-
72
- it "skips token creation if there is already one reusable" do
73
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
74
- FactoryBot.create(:access_token, application_id: client.id, resource_owner_id: owner.id)
75
-
76
- expect do
77
- subject.authorize
78
- end.not_to(change { Doorkeeper::AccessToken.count })
79
- end
80
-
81
- it "creates token when there is already one but non reusable" do
82
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
83
- FactoryBot.create(:access_token, application_id: client.id, resource_owner_id: owner.id)
84
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:reusable?).and_return(false)
85
-
86
- expect do
87
- subject.authorize
88
- end.to change { Doorkeeper::AccessToken.count }.by(1)
89
- end
90
-
91
- it "calls configured request callback methods" do
92
- expect(Doorkeeper.configuration.before_successful_strategy_response)
93
- .to receive(:call).with(subject).once
94
-
95
- expect(Doorkeeper.configuration.after_successful_strategy_response)
96
- .to receive(:call).with(subject, instance_of(Doorkeeper::OAuth::TokenResponse)).once
97
-
98
- subject.authorize
99
- end
100
-
101
- describe "with scopes" do
102
- subject do
103
- described_class.new(server, client, owner, scope: "public")
104
- end
105
-
106
- context "when scopes_by_grant_type is not configured for grant_type" do
107
- it "returns error when scopes are invalid" do
108
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("another"))
109
- subject.validate
110
- expect(subject.error).to eq(:invalid_scope)
111
- end
112
-
113
- it "creates the token with scopes if scopes are valid" do
114
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
115
- expect do
116
- subject.authorize
117
- end.to change { Doorkeeper::AccessToken.count }.by(1)
118
-
119
- expect(Doorkeeper::AccessToken.last.scopes).to include("public")
120
- end
121
- end
122
-
123
- context "when scopes_by_grant_type is configured for grant_type" do
124
- it "returns error when scopes are valid but not permitted for grant_type" do
125
- allow(server)
126
- .to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
127
- allow(Doorkeeper.configuration)
128
- .to receive(:scopes_by_grant_type).and_return(password: "another")
129
- subject.validate
130
- expect(subject.error).to eq(:invalid_scope)
131
- end
132
-
133
- it "creates the token with scopes if scopes are valid and permitted for grant_type" do
134
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
135
- allow(Doorkeeper.configuration)
136
- .to receive(:scopes_by_grant_type).and_return(password: [:public])
137
-
138
- expect do
139
- subject.authorize
140
- end.to change { Doorkeeper::AccessToken.count }.by(1)
141
-
142
- expect(Doorkeeper::AccessToken.last.scopes).to include("public")
143
- end
144
- end
145
- end
146
-
147
- describe "with custom expiry" do
148
- let(:server) do
149
- double(
150
- :server,
151
- default_scopes: Doorkeeper::OAuth::Scopes.new,
152
- access_token_expires_in: 2.hours,
153
- refresh_token_enabled?: false,
154
- custom_access_token_expires_in: lambda { |context|
155
- if context.scopes.exists?("public")
156
- 222
157
- elsif context.scopes.exists?("magic")
158
- Float::INFINITY
159
- end
160
- },
161
- )
162
- end
163
-
164
- before do
165
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
166
- end
167
-
168
- it "checks scopes" do
169
- subject = described_class.new(server, client, owner, scope: "public")
170
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
171
-
172
- expect do
173
- subject.authorize
174
- end.to change { Doorkeeper::AccessToken.count }.by(1)
175
-
176
- expect(Doorkeeper::AccessToken.last.expires_in).to eq(222)
177
- end
178
-
179
- it "falls back to the default otherwise" do
180
- subject = described_class.new(server, client, owner, scope: "private")
181
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("private"))
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(2.hours)
188
- end
189
- end
190
- end