doorkeeper 4.4.3 → 5.5.2

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 (282) hide show
  1. checksums.yaml +5 -5
  2. data/{NEWS.md → CHANGELOG.md} +393 -19
  3. data/README.md +97 -393
  4. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +8 -5
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +7 -11
  7. data/app/controllers/doorkeeper/applications_controller.rb +62 -27
  8. data/app/controllers/doorkeeper/authorizations_controller.rb +97 -17
  9. data/app/controllers/doorkeeper/authorized_applications_controller.rb +22 -3
  10. data/app/controllers/doorkeeper/token_info_controller.rb +16 -4
  11. data/app/controllers/doorkeeper/tokens_controller.rb +98 -32
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +9 -7
  13. data/app/views/doorkeeper/applications/_delete_form.html.erb +3 -1
  14. data/app/views/doorkeeper/applications/_form.html.erb +27 -26
  15. data/app/views/doorkeeper/applications/edit.html.erb +1 -1
  16. data/app/views/doorkeeper/applications/index.html.erb +17 -7
  17. data/app/views/doorkeeper/applications/new.html.erb +1 -1
  18. data/app/views/doorkeeper/applications/show.html.erb +38 -17
  19. data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
  20. data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
  21. data/app/views/doorkeeper/authorizations/new.html.erb +6 -0
  22. data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
  23. data/config/locales/en.yml +23 -3
  24. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  25. data/lib/doorkeeper/config/option.rb +82 -0
  26. data/lib/doorkeeper/config/validations.rb +53 -0
  27. data/lib/doorkeeper/config.rb +471 -140
  28. data/lib/doorkeeper/engine.rb +8 -2
  29. data/lib/doorkeeper/errors.rb +25 -16
  30. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  31. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  32. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  33. data/lib/doorkeeper/grant_flow.rb +45 -0
  34. data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
  35. data/lib/doorkeeper/grape/helpers.rb +13 -7
  36. data/lib/doorkeeper/helpers/controller.rb +43 -10
  37. data/lib/doorkeeper/models/access_grant_mixin.rb +97 -3
  38. data/lib/doorkeeper/models/access_token_mixin.rb +272 -66
  39. data/lib/doorkeeper/models/application_mixin.rb +50 -5
  40. data/lib/doorkeeper/models/concerns/accessible.rb +2 -0
  41. data/lib/doorkeeper/models/concerns/expirable.rb +7 -3
  42. data/lib/doorkeeper/models/concerns/orderable.rb +2 -0
  43. data/lib/doorkeeper/models/concerns/ownership.rb +4 -7
  44. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  45. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  46. data/lib/doorkeeper/models/concerns/revocable.rb +3 -27
  47. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  48. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  49. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  50. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  51. data/lib/doorkeeper/oauth/authorization/token.rb +58 -24
  52. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +7 -5
  53. data/lib/doorkeeper/oauth/authorization_code_request.rb +58 -10
  54. data/lib/doorkeeper/oauth/base_request.rb +35 -24
  55. data/lib/doorkeeper/oauth/base_response.rb +2 -0
  56. data/lib/doorkeeper/oauth/client/credentials.rb +5 -5
  57. data/lib/doorkeeper/oauth/client.rb +10 -11
  58. data/lib/doorkeeper/oauth/client_credentials/creator.rb +47 -4
  59. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +16 -9
  60. data/lib/doorkeeper/oauth/client_credentials/validator.rb +56 -0
  61. data/lib/doorkeeper/oauth/client_credentials_request.rb +10 -11
  62. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  63. data/lib/doorkeeper/oauth/code_response.rb +27 -15
  64. data/lib/doorkeeper/oauth/error.rb +3 -1
  65. data/lib/doorkeeper/oauth/error_response.rb +35 -14
  66. data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
  67. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -18
  68. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  69. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +42 -7
  70. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  71. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  72. data/lib/doorkeeper/oauth/invalid_token_response.rb +29 -4
  73. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  74. data/lib/doorkeeper/oauth/password_access_token_request.rb +43 -10
  75. data/lib/doorkeeper/oauth/pre_authorization.rb +133 -26
  76. data/lib/doorkeeper/oauth/refresh_token_request.rb +59 -31
  77. data/lib/doorkeeper/oauth/scopes.rb +8 -4
  78. data/lib/doorkeeper/oauth/token.rb +12 -8
  79. data/lib/doorkeeper/oauth/token_introspection.rb +97 -23
  80. data/lib/doorkeeper/oauth/token_request.rb +8 -20
  81. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  82. data/lib/doorkeeper/oauth.rb +13 -0
  83. data/lib/doorkeeper/orm/active_record/access_grant.rb +5 -30
  84. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -43
  85. data/lib/doorkeeper/orm/active_record/application.rb +6 -57
  86. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
  87. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
  88. data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
  89. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  90. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  91. data/lib/doorkeeper/orm/active_record.rb +27 -9
  92. data/lib/doorkeeper/rails/helpers.rb +10 -8
  93. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  94. data/lib/doorkeeper/rails/routes/mapper.rb +4 -2
  95. data/lib/doorkeeper/rails/routes/mapping.rb +9 -7
  96. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  97. data/lib/doorkeeper/rails/routes.rb +37 -30
  98. data/lib/doorkeeper/rake/db.rake +40 -0
  99. data/lib/doorkeeper/rake/setup.rake +11 -0
  100. data/lib/doorkeeper/rake.rb +14 -0
  101. data/lib/doorkeeper/request/authorization_code.rb +6 -4
  102. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  103. data/lib/doorkeeper/request/code.rb +1 -1
  104. data/lib/doorkeeper/request/password.rb +4 -3
  105. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  106. data/lib/doorkeeper/request/strategy.rb +4 -2
  107. data/lib/doorkeeper/request/token.rb +1 -1
  108. data/lib/doorkeeper/request.rb +61 -34
  109. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  110. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  111. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  112. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  113. data/lib/doorkeeper/server.rb +9 -11
  114. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  115. data/lib/doorkeeper/validations.rb +2 -0
  116. data/lib/doorkeeper/version.rb +7 -29
  117. data/lib/doorkeeper.rb +111 -64
  118. data/lib/generators/doorkeeper/application_owner_generator.rb +24 -18
  119. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  120. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  121. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  122. data/lib/generators/doorkeeper/migration_generator.rb +23 -18
  123. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  124. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +28 -22
  125. data/{spec/dummy/db/migrate/20180210183654_add_confidential_to_application.rb → lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb} +2 -2
  126. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +3 -1
  127. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
  128. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  129. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  130. data/lib/generators/doorkeeper/templates/initializer.rb +382 -30
  131. data/lib/generators/doorkeeper/templates/migration.rb.erb +35 -16
  132. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  133. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  134. metadata +95 -309
  135. data/.coveralls.yml +0 -1
  136. data/.github/ISSUE_TEMPLATE.md +0 -25
  137. data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  138. data/.gitignore +0 -19
  139. data/.hound.yml +0 -2
  140. data/.rspec +0 -1
  141. data/.rubocop.yml +0 -17
  142. data/.travis.yml +0 -38
  143. data/Appraisals +0 -18
  144. data/CODE_OF_CONDUCT.md +0 -46
  145. data/CONTRIBUTING.md +0 -47
  146. data/Gemfile +0 -10
  147. data/RELEASING.md +0 -10
  148. data/Rakefile +0 -20
  149. data/SECURITY.md +0 -15
  150. data/app/validators/redirect_uri_validator.rb +0 -44
  151. data/doorkeeper.gemspec +0 -32
  152. data/gemfiles/rails_4_2.gemfile +0 -13
  153. data/gemfiles/rails_5_0.gemfile +0 -12
  154. data/gemfiles/rails_5_1.gemfile +0 -12
  155. data/gemfiles/rails_5_2.gemfile +0 -12
  156. data/gemfiles/rails_master.gemfile +0 -14
  157. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  158. data/lib/generators/doorkeeper/add_client_confidentiality_generator.rb +0 -31
  159. data/lib/generators/doorkeeper/templates/add_confidential_to_application_migration.rb.erb +0 -11
  160. data/spec/controllers/application_metal_controller.rb +0 -10
  161. data/spec/controllers/applications_controller_spec.rb +0 -69
  162. data/spec/controllers/authorizations_controller_spec.rb +0 -250
  163. data/spec/controllers/protected_resources_controller_spec.rb +0 -309
  164. data/spec/controllers/token_info_controller_spec.rb +0 -56
  165. data/spec/controllers/tokens_controller_spec.rb +0 -274
  166. data/spec/dummy/Rakefile +0 -7
  167. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  168. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  169. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  170. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  171. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  172. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  173. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  174. data/spec/dummy/app/models/user.rb +0 -5
  175. data/spec/dummy/app/views/home/index.html.erb +0 -0
  176. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  177. data/spec/dummy/config/application.rb +0 -23
  178. data/spec/dummy/config/boot.rb +0 -9
  179. data/spec/dummy/config/database.yml +0 -15
  180. data/spec/dummy/config/environment.rb +0 -5
  181. data/spec/dummy/config/environments/development.rb +0 -29
  182. data/spec/dummy/config/environments/production.rb +0 -62
  183. data/spec/dummy/config/environments/test.rb +0 -44
  184. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  185. data/spec/dummy/config/initializers/doorkeeper.rb +0 -112
  186. data/spec/dummy/config/initializers/new_framework_defaults.rb +0 -6
  187. data/spec/dummy/config/initializers/secret_token.rb +0 -8
  188. data/spec/dummy/config/initializers/session_store.rb +0 -8
  189. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  190. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  191. data/spec/dummy/config/routes.rb +0 -52
  192. data/spec/dummy/config.ru +0 -4
  193. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  194. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  195. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -62
  196. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  197. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  198. data/spec/dummy/db/schema.rb +0 -68
  199. data/spec/dummy/public/404.html +0 -26
  200. data/spec/dummy/public/422.html +0 -26
  201. data/spec/dummy/public/500.html +0 -26
  202. data/spec/dummy/public/favicon.ico +0 -0
  203. data/spec/dummy/script/rails +0 -6
  204. data/spec/factories.rb +0 -28
  205. data/spec/generators/application_owner_generator_spec.rb +0 -41
  206. data/spec/generators/install_generator_spec.rb +0 -31
  207. data/spec/generators/migration_generator_spec.rb +0 -41
  208. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -57
  209. data/spec/generators/templates/routes.rb +0 -3
  210. data/spec/generators/views_generator_spec.rb +0 -27
  211. data/spec/grape/grape_integration_spec.rb +0 -135
  212. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  213. data/spec/lib/config_spec.rb +0 -462
  214. data/spec/lib/doorkeeper_spec.rb +0 -150
  215. data/spec/lib/models/expirable_spec.rb +0 -50
  216. data/spec/lib/models/revocable_spec.rb +0 -59
  217. data/spec/lib/models/scopes_spec.rb +0 -43
  218. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -41
  219. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -123
  220. data/spec/lib/oauth/base_request_spec.rb +0 -155
  221. data/spec/lib/oauth/base_response_spec.rb +0 -45
  222. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  223. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  224. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  225. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  226. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  227. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -105
  228. data/spec/lib/oauth/client_spec.rb +0 -39
  229. data/spec/lib/oauth/code_request_spec.rb +0 -43
  230. data/spec/lib/oauth/code_response_spec.rb +0 -34
  231. data/spec/lib/oauth/error_response_spec.rb +0 -61
  232. data/spec/lib/oauth/error_spec.rb +0 -23
  233. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
  234. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
  235. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
  236. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -218
  237. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -56
  238. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -96
  239. data/spec/lib/oauth/pre_authorization_spec.rb +0 -160
  240. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -166
  241. data/spec/lib/oauth/scopes_spec.rb +0 -149
  242. data/spec/lib/oauth/token_request_spec.rb +0 -96
  243. data/spec/lib/oauth/token_response_spec.rb +0 -85
  244. data/spec/lib/oauth/token_spec.rb +0 -116
  245. data/spec/lib/request/strategy_spec.rb +0 -53
  246. data/spec/lib/server_spec.rb +0 -59
  247. data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
  248. data/spec/models/doorkeeper/access_token_spec.rb +0 -418
  249. data/spec/models/doorkeeper/application_spec.rb +0 -303
  250. data/spec/requests/applications/applications_request_spec.rb +0 -94
  251. data/spec/requests/applications/authorized_applications_spec.rb +0 -30
  252. data/spec/requests/endpoints/authorization_spec.rb +0 -71
  253. data/spec/requests/endpoints/token_spec.rb +0 -71
  254. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -76
  255. data/spec/requests/flows/authorization_code_spec.rb +0 -149
  256. data/spec/requests/flows/client_credentials_spec.rb +0 -86
  257. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
  258. data/spec/requests/flows/implicit_grant_spec.rb +0 -61
  259. data/spec/requests/flows/password_spec.rb +0 -197
  260. data/spec/requests/flows/refresh_token_spec.rb +0 -174
  261. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  262. data/spec/requests/flows/skip_authorization_spec.rb +0 -59
  263. data/spec/requests/protected_resources/metal_spec.rb +0 -14
  264. data/spec/requests/protected_resources/private_api_spec.rb +0 -81
  265. data/spec/routing/custom_controller_routes_spec.rb +0 -75
  266. data/spec/routing/default_routes_spec.rb +0 -39
  267. data/spec/routing/scoped_routes_spec.rb +0 -31
  268. data/spec/spec_helper.rb +0 -4
  269. data/spec/spec_helper_integration.rb +0 -74
  270. data/spec/support/dependencies/factory_girl.rb +0 -2
  271. data/spec/support/helpers/access_token_request_helper.rb +0 -11
  272. data/spec/support/helpers/authorization_request_helper.rb +0 -41
  273. data/spec/support/helpers/config_helper.rb +0 -9
  274. data/spec/support/helpers/model_helper.rb +0 -72
  275. data/spec/support/helpers/request_spec_helper.rb +0 -88
  276. data/spec/support/helpers/url_helper.rb +0 -56
  277. data/spec/support/http_method_shim.rb +0 -38
  278. data/spec/support/orm/active_record.rb +0 -3
  279. data/spec/support/shared/controllers_shared_context.rb +0 -65
  280. data/spec/support/shared/models_shared_examples.rb +0 -52
  281. data/spec/validators/redirect_uri_validator_spec.rb +0 -123
  282. data/spec/version/version_spec.rb +0 -15
@@ -1,303 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper
4
- describe Application do
5
- let(:require_owner) { Doorkeeper.configuration.instance_variable_set('@confirm_application_owner', true) }
6
- let(:unset_require_owner) { Doorkeeper.configuration.instance_variable_set('@confirm_application_owner', false) }
7
- let(:new_application) { FactoryBot.build(:application) }
8
-
9
- let(:uid) { SecureRandom.hex(8) }
10
- let(:secret) { SecureRandom.hex(8) }
11
-
12
- context 'application_owner is enabled' do
13
- before do
14
- Doorkeeper.configure do
15
- orm DOORKEEPER_ORM
16
- enable_application_owner
17
- end
18
- end
19
-
20
- context 'application owner is not required' do
21
- before(:each) do
22
- unset_require_owner
23
- end
24
-
25
- it 'is valid given valid attributes' do
26
- expect(new_application).to be_valid
27
- end
28
- end
29
-
30
- context 'application owner is required' do
31
- before(:each) do
32
- require_owner
33
- @owner = FactoryBot.build_stubbed(:doorkeeper_testing_user)
34
- end
35
-
36
- it 'is invalid without an owner' do
37
- expect(new_application).not_to be_valid
38
- end
39
-
40
- it 'is valid with an owner' do
41
- new_application.owner = @owner
42
- expect(new_application).to be_valid
43
- end
44
- end
45
- end
46
-
47
- it 'is invalid without a name' do
48
- new_application.name = nil
49
- expect(new_application).not_to be_valid
50
- end
51
-
52
- it 'is invalid without determining confidentiality' do
53
- new_application.confidential = nil
54
- expect(new_application).not_to be_valid
55
- end
56
-
57
- it 'generates uid on create' do
58
- expect(new_application.uid).to be_nil
59
- new_application.save
60
- expect(new_application.uid).not_to be_nil
61
- end
62
-
63
- it 'generates uid on create if an empty string' do
64
- new_application.uid = ''
65
- new_application.save
66
- expect(new_application.uid).not_to be_blank
67
- end
68
-
69
- it 'generates uid on create unless one is set' do
70
- new_application.uid = uid
71
- new_application.save
72
- expect(new_application.uid).to eq(uid)
73
- end
74
-
75
- it 'is invalid without uid' do
76
- new_application.save
77
- new_application.uid = nil
78
- expect(new_application).not_to be_valid
79
- end
80
-
81
- it 'is invalid without redirect_uri' do
82
- new_application.save
83
- new_application.redirect_uri = nil
84
- expect(new_application).not_to be_valid
85
- end
86
-
87
- it 'checks uniqueness of uid' do
88
- app1 = FactoryBot.create(:application)
89
- app2 = FactoryBot.create(:application)
90
- app2.uid = app1.uid
91
- expect(app2).not_to be_valid
92
- end
93
-
94
- it 'expects database to throw an error when uids are the same' do
95
- app1 = FactoryBot.create(:application)
96
- app2 = FactoryBot.create(:application)
97
- app2.uid = app1.uid
98
- expect { app2.save!(validate: false) }.to raise_error(uniqueness_error)
99
- end
100
-
101
- it 'generate secret on create' do
102
- expect(new_application.secret).to be_nil
103
- new_application.save
104
- expect(new_application.secret).not_to be_nil
105
- end
106
-
107
- it 'generate secret on create if is blank string' do
108
- new_application.secret = ''
109
- new_application.save
110
- expect(new_application.secret).not_to be_blank
111
- end
112
-
113
- it 'generate secret on create unless one is set' do
114
- new_application.secret = secret
115
- new_application.save
116
- expect(new_application.secret).to eq(secret)
117
- end
118
-
119
- it 'is invalid without secret' do
120
- new_application.save
121
- new_application.secret = nil
122
- expect(new_application).not_to be_valid
123
- end
124
-
125
- describe 'destroy related models on cascade' do
126
- before(:each) do
127
- new_application.save
128
- end
129
-
130
- it 'should destroy its access grants' do
131
- FactoryBot.create(:access_grant, application: new_application)
132
- expect { new_application.destroy }.to change { Doorkeeper::AccessGrant.count }.by(-1)
133
- end
134
-
135
- it 'should destroy its access tokens' do
136
- FactoryBot.create(:access_token, application: new_application)
137
- FactoryBot.create(:access_token, application: new_application, revoked_at: Time.now.utc)
138
- expect do
139
- new_application.destroy
140
- end.to change { Doorkeeper::AccessToken.count }.by(-2)
141
- end
142
- end
143
-
144
- describe :ordered_by do
145
- let(:applications) { FactoryBot.create_list(:application, 5) }
146
-
147
- context 'when a direction is not specified' do
148
- it 'calls order with a default order of asc' do
149
- names = applications.map(&:name).sort
150
- expect(Application.ordered_by(:name).map(&:name)).to eq(names)
151
- end
152
- end
153
-
154
- context 'when a direction is specified' do
155
- it 'calls order with specified direction' do
156
- names = applications.map(&:name).sort.reverse
157
- expect(Application.ordered_by(:name, :desc).map(&:name)).to eq(names)
158
- end
159
- end
160
- end
161
-
162
- describe "#redirect_uri=" do
163
- context "when array of valid redirect_uris" do
164
- it "should join by newline" do
165
- new_application.redirect_uri = ['http://localhost/callback1', 'http://localhost/callback2']
166
- expect(new_application.redirect_uri).to eq("http://localhost/callback1\nhttp://localhost/callback2")
167
- end
168
- end
169
- context "when string of valid redirect_uris" do
170
- it "should store as-is" do
171
- new_application.redirect_uri = "http://localhost/callback1\nhttp://localhost/callback2"
172
- expect(new_application.redirect_uri).to eq("http://localhost/callback1\nhttp://localhost/callback2")
173
- end
174
- end
175
- end
176
-
177
- describe :authorized_for do
178
- let(:resource_owner) { double(:resource_owner, id: 10) }
179
-
180
- it 'is empty if the application is not authorized for anyone' do
181
- expect(Application.authorized_for(resource_owner)).to be_empty
182
- end
183
-
184
- it 'returns only application for a specific resource owner' do
185
- FactoryBot.create(:access_token, resource_owner_id: resource_owner.id + 1)
186
- token = FactoryBot.create(:access_token, resource_owner_id: resource_owner.id)
187
- expect(Application.authorized_for(resource_owner)).to eq([token.application])
188
- end
189
-
190
- it 'excludes revoked tokens' do
191
- FactoryBot.create(:access_token, resource_owner_id: resource_owner.id, revoked_at: 2.days.ago)
192
- expect(Application.authorized_for(resource_owner)).to be_empty
193
- end
194
-
195
- it 'returns all applications that have been authorized' do
196
- token1 = FactoryBot.create(:access_token, resource_owner_id: resource_owner.id)
197
- token2 = FactoryBot.create(:access_token, resource_owner_id: resource_owner.id)
198
- expect(Application.authorized_for(resource_owner)).to eq([token1.application, token2.application])
199
- end
200
-
201
- it 'returns only one application even if it has been authorized twice' do
202
- application = FactoryBot.create(:application)
203
- FactoryBot.create(:access_token, resource_owner_id: resource_owner.id, application: application)
204
- FactoryBot.create(:access_token, resource_owner_id: resource_owner.id, application: application)
205
- expect(Application.authorized_for(resource_owner)).to eq([application])
206
- end
207
- end
208
-
209
- describe :by_uid_and_secret do
210
- context "when application is private/confidential" do
211
- it "finds the application via uid/secret" do
212
- app = FactoryBot.create :application
213
- authenticated = Application.by_uid_and_secret(app.uid, app.secret)
214
- expect(authenticated).to eq(app)
215
- end
216
- context "when secret is wrong" do
217
- it "should not find the application" do
218
- app = FactoryBot.create :application
219
- authenticated = Application.by_uid_and_secret(app.uid, 'bad')
220
- expect(authenticated).to eq(nil)
221
- end
222
- end
223
- end
224
-
225
- context "when application is public/non-confidential" do
226
- context "when secret is blank" do
227
- it "should find the application" do
228
- app = FactoryBot.create :application, confidential: false
229
- authenticated = Application.by_uid_and_secret(app.uid, nil)
230
- expect(authenticated).to eq(app)
231
- end
232
- end
233
- context "when secret is wrong" do
234
- it "should not find the application" do
235
- app = FactoryBot.create :application, confidential: false
236
- authenticated = Application.by_uid_and_secret(app.uid, 'bad')
237
- expect(authenticated).to eq(nil)
238
- end
239
- end
240
- end
241
- end
242
-
243
- describe :confidential? do
244
- subject { FactoryBot.create(:application, confidential: confidential).confidential? }
245
-
246
- context 'when application is private/confidential' do
247
- let(:confidential) { true }
248
- it { expect(subject).to eq(true) }
249
- end
250
-
251
- context 'when application is public/non-confidential' do
252
- let(:confidential) { false }
253
- it { expect(subject).to eq(false) }
254
- end
255
- end
256
-
257
- describe :confidential do
258
- subject { FactoryBot.create(:application, confidential: confidential).confidential }
259
-
260
- context 'when application is private/confidential' do
261
- let(:confidential) { true }
262
- it { expect(subject).to eq(true) }
263
- end
264
-
265
- context 'when application is public/non-confidential' do
266
- let(:confidential) { false }
267
- it { expect(subject).to eq(false) }
268
- end
269
-
270
- context 'when the application does not support confidentiality' do
271
- let(:confidential) { false }
272
-
273
- before { allow(Application).to receive(:supports_confidentiality?).and_return(false) }
274
-
275
- it 'warns of the CVE' do
276
- expect(ActiveSupport::Deprecation).to receive(:warn).with(
277
- 'You are susceptible to security bug ' \
278
- 'CVE-2018-1000211. Please follow instructions outlined in ' \
279
- 'Doorkeeper::CVE_2018_1000211_WARNING'
280
- )
281
- Application.new.confidential
282
- end
283
-
284
- it { expect(subject).to eq(true) }
285
- end
286
- end
287
-
288
- describe :supports_confidentiality? do
289
- context 'when no column' do
290
- it 'returns false' do
291
- expect(Application).to receive(:column_names).and_return(%w[foo bar])
292
- expect(Application.supports_confidentiality?).to eq(false)
293
- end
294
- end
295
- context 'when column' do
296
- it 'returns true' do
297
- expect(Application).to receive(:column_names).and_return(%w[foo bar confidential])
298
- expect(Application.supports_confidentiality?).to eq(true)
299
- end
300
- end
301
- end
302
- end
303
- end
@@ -1,94 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- feature 'Adding applications' do
4
- context 'in application form' do
5
- background do
6
- visit '/oauth/applications/new'
7
- end
8
-
9
- scenario 'adding a valid app' do
10
- fill_in 'doorkeeper_application[name]', with: 'My Application'
11
- fill_in 'doorkeeper_application[redirect_uri]',
12
- with: 'https://example.com'
13
-
14
- click_button 'Submit'
15
- i_should_see 'Application created'
16
- i_should_see 'My Application'
17
- end
18
-
19
- scenario 'adding invalid app' do
20
- click_button 'Submit'
21
- i_should_see 'Whoops! Check your form for possible errors'
22
- end
23
- end
24
- end
25
-
26
- feature 'Listing applications' do
27
- background do
28
- FactoryBot.create :application, name: 'Oauth Dude'
29
- FactoryBot.create :application, name: 'Awesome App'
30
- end
31
-
32
- scenario 'application list' do
33
- visit '/oauth/applications'
34
- i_should_see 'Awesome App'
35
- i_should_see 'Oauth Dude'
36
- end
37
- end
38
-
39
- feature 'Show application' do
40
- given :app do
41
- FactoryBot.create :application, name: 'Just another oauth app'
42
- end
43
-
44
- scenario 'visiting application page' do
45
- visit "/oauth/applications/#{app.id}"
46
- i_should_see 'Just another oauth app'
47
- end
48
- end
49
-
50
- feature 'Edit application' do
51
- let :app do
52
- FactoryBot.create :application, name: 'OMG my app'
53
- end
54
-
55
- background do
56
- visit "/oauth/applications/#{app.id}/edit"
57
- end
58
-
59
- scenario 'updating a valid app' do
60
- fill_in 'doorkeeper_application[name]', with: 'Serious app'
61
- click_button 'Submit'
62
- i_should_see 'Application updated'
63
- i_should_see 'Serious app'
64
- i_should_not_see 'OMG my app'
65
- end
66
-
67
- scenario 'updating an invalid app' do
68
- fill_in 'doorkeeper_application[name]', with: ''
69
- click_button 'Submit'
70
- i_should_see 'Whoops! Check your form for possible errors'
71
- end
72
- end
73
-
74
- feature 'Remove application' do
75
- background do
76
- @app = FactoryBot.create :application
77
- end
78
-
79
- scenario 'deleting an application from list' do
80
- visit '/oauth/applications'
81
- i_should_see @app.name
82
- within(:css, "tr#application_#{@app.id}") do
83
- click_button 'Destroy'
84
- end
85
- i_should_see 'Application deleted'
86
- i_should_not_see @app.name
87
- end
88
-
89
- scenario 'deleting an application from show' do
90
- visit "/oauth/applications/#{@app.id}"
91
- click_button 'Destroy'
92
- i_should_see 'Application deleted'
93
- end
94
- end
@@ -1,30 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- feature 'Authorized applications' do
4
- background do
5
- @user = User.create!(name: 'Joe', password: 'sekret')
6
- @client = client_exists(name: 'Amazing Client App')
7
- resource_owner_is_authenticated @user
8
- client_is_authorized @client, @user
9
- end
10
-
11
- scenario 'display user\'s authorized applications' do
12
- visit '/oauth/authorized_applications'
13
- i_should_see 'Amazing Client App'
14
- end
15
-
16
- scenario 'do not display other user\'s authorized applications' do
17
- client = client_exists(name: 'Another Client App')
18
- client_is_authorized client, User.create!(name: 'Joe', password: 'sekret')
19
- visit '/oauth/authorized_applications'
20
- i_should_not_see 'Another Client App'
21
- end
22
-
23
- scenario 'user revoke access to application' do
24
- visit '/oauth/authorized_applications'
25
- i_should_see 'Amazing Client App'
26
- click_on 'Revoke'
27
- i_should_see 'Application revoked'
28
- i_should_not_see 'Amazing Client App'
29
- end
30
- end
@@ -1,71 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- feature 'Authorization endpoint' do
4
- background do
5
- config_is_set(:authenticate_resource_owner) { User.first || redirect_to('/sign_in') }
6
- client_exists(name: 'MyApp')
7
- end
8
-
9
- scenario 'requires resource owner to be authenticated' do
10
- visit authorization_endpoint_url(client: @client)
11
- i_should_see 'Sign in'
12
- i_should_be_on '/'
13
- end
14
-
15
- context 'with authenticated resource owner' do
16
- background do
17
- create_resource_owner
18
- sign_in
19
- end
20
-
21
- scenario 'displays the authorization form' do
22
- visit authorization_endpoint_url(client: @client)
23
- i_should_see 'Authorize MyApp to use your account?'
24
- end
25
-
26
- scenario 'displays all requested scopes' do
27
- default_scopes_exist :public
28
- optional_scopes_exist :write
29
- visit authorization_endpoint_url(client: @client, scope: 'public write')
30
- i_should_see 'Access your public data'
31
- i_should_see 'Update your data'
32
- end
33
- end
34
-
35
- context 'with a invalid request' do
36
- background do
37
- create_resource_owner
38
- sign_in
39
- end
40
-
41
- scenario 'displays the related error' do
42
- visit authorization_endpoint_url(client: @client, response_type: '')
43
- i_should_not_see 'Authorize'
44
- i_should_see_translated_error_message :unsupported_response_type
45
- end
46
-
47
- scenario "displays unsupported_response_type error when using a disabled response type" do
48
- config_is_set(:grant_flows, ['implicit'])
49
- visit authorization_endpoint_url(client: @client, response_type: 'code')
50
- i_should_not_see "Authorize"
51
- i_should_see_translated_error_message :unsupported_response_type
52
- end
53
- end
54
-
55
- context 'forgery protection enabled' do
56
- background do
57
- create_resource_owner
58
- sign_in
59
- end
60
-
61
- scenario 'raises exception on forged requests' do
62
- allowing_forgery_protection do
63
- expect {
64
- page.driver.post authorization_endpoint_url(client_id: @client.uid,
65
- redirect_uri: @client.redirect_uri,
66
- response_type: 'code')
67
- }.to raise_error(ActionController::InvalidAuthenticityToken)
68
- end
69
- end
70
- end
71
- end