doorkeeper 4.2.0 → 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 (271) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1038 -0
  3. data/README.md +110 -348
  4. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +6 -7
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +7 -11
  7. data/app/controllers/doorkeeper/applications_controller.rb +65 -20
  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 +112 -35
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +10 -6
  13. data/app/views/doorkeeper/applications/_delete_form.html.erb +4 -3
  14. data/app/views/doorkeeper/applications/_form.html.erb +33 -21
  15. data/app/views/doorkeeper/applications/edit.html.erb +1 -1
  16. data/app/views/doorkeeper/applications/index.html.erb +18 -6
  17. data/app/views/doorkeeper/applications/new.html.erb +1 -1
  18. data/app/views/doorkeeper/applications/show.html.erb +40 -16
  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 +7 -1
  22. data/app/views/doorkeeper/authorized_applications/_delete_form.html.erb +1 -2
  23. data/app/views/doorkeeper/authorized_applications/index.html.erb +0 -1
  24. data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
  25. data/config/locales/en.yml +33 -9
  26. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  27. data/lib/doorkeeper/config/option.rb +82 -0
  28. data/lib/doorkeeper/config/validations.rb +53 -0
  29. data/lib/doorkeeper/config.rb +545 -143
  30. data/lib/doorkeeper/engine.rb +11 -5
  31. data/lib/doorkeeper/errors.rb +37 -10
  32. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  33. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  34. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  35. data/lib/doorkeeper/grant_flow.rb +45 -0
  36. data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
  37. data/lib/doorkeeper/grape/helpers.rb +24 -12
  38. data/lib/doorkeeper/helpers/controller.rb +49 -27
  39. data/lib/doorkeeper/models/access_grant_mixin.rb +100 -21
  40. data/lib/doorkeeper/models/access_token_mixin.rb +379 -75
  41. data/lib/doorkeeper/models/application_mixin.rb +72 -25
  42. data/lib/doorkeeper/models/concerns/accessible.rb +6 -0
  43. data/lib/doorkeeper/models/concerns/expirable.rb +20 -6
  44. data/lib/doorkeeper/models/concerns/orderable.rb +15 -0
  45. data/lib/doorkeeper/models/concerns/ownership.rb +4 -7
  46. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  47. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  48. data/lib/doorkeeper/models/concerns/revocable.rb +12 -18
  49. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  50. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  51. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  52. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  53. data/lib/doorkeeper/oauth/authorization/token.rb +66 -28
  54. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
  55. data/lib/doorkeeper/oauth/authorization_code_request.rb +64 -14
  56. data/lib/doorkeeper/oauth/base_request.rb +66 -0
  57. data/lib/doorkeeper/oauth/base_response.rb +31 -0
  58. data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
  59. data/lib/doorkeeper/oauth/client.rb +10 -12
  60. data/lib/doorkeeper/oauth/client_credentials/creator.rb +47 -4
  61. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +16 -9
  62. data/lib/doorkeeper/oauth/client_credentials/validator.rb +56 -0
  63. data/lib/doorkeeper/oauth/client_credentials_request.rb +11 -15
  64. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  65. data/lib/doorkeeper/oauth/code_response.rb +28 -15
  66. data/lib/doorkeeper/oauth/error.rb +5 -3
  67. data/lib/doorkeeper/oauth/error_response.rb +41 -20
  68. data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
  69. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -18
  70. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  71. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +53 -3
  72. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  73. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  74. data/lib/doorkeeper/oauth/invalid_token_response.rb +31 -5
  75. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  76. data/lib/doorkeeper/oauth/password_access_token_request.rb +45 -13
  77. data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
  78. data/lib/doorkeeper/oauth/refresh_token_request.rb +61 -36
  79. data/lib/doorkeeper/oauth/scopes.rb +26 -12
  80. data/lib/doorkeeper/oauth/token.rb +25 -23
  81. data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
  82. data/lib/doorkeeper/oauth/token_request.rb +8 -21
  83. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  84. data/lib/doorkeeper/oauth.rb +13 -0
  85. data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
  86. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -25
  87. data/lib/doorkeeper/orm/active_record/application.rb +6 -15
  88. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
  89. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
  90. data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
  91. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  92. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  93. data/lib/doorkeeper/orm/active_record.rb +37 -8
  94. data/lib/doorkeeper/rails/helpers.rb +14 -15
  95. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  96. data/lib/doorkeeper/rails/routes/mapper.rb +3 -1
  97. data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
  98. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  99. data/lib/doorkeeper/rails/routes.rb +42 -30
  100. data/lib/doorkeeper/rake/db.rake +40 -0
  101. data/lib/doorkeeper/rake/setup.rake +11 -0
  102. data/lib/doorkeeper/rake.rb +14 -0
  103. data/lib/doorkeeper/request/authorization_code.rb +12 -4
  104. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  105. data/lib/doorkeeper/request/code.rb +1 -1
  106. data/lib/doorkeeper/request/password.rb +5 -14
  107. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  108. data/lib/doorkeeper/request/strategy.rb +4 -2
  109. data/lib/doorkeeper/request/token.rb +1 -1
  110. data/lib/doorkeeper/request.rb +62 -29
  111. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  112. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  113. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  114. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  115. data/lib/doorkeeper/server.rb +9 -19
  116. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  117. data/lib/doorkeeper/validations.rb +5 -2
  118. data/lib/doorkeeper/version.rb +12 -1
  119. data/lib/doorkeeper.rb +111 -56
  120. data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
  121. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  122. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  123. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  124. data/lib/generators/doorkeeper/migration_generator.rb +27 -10
  125. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  126. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +31 -19
  127. data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
  128. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
  129. data/lib/generators/doorkeeper/templates/{add_previous_refresh_token_to_access_tokens.rb → add_previous_refresh_token_to_access_tokens.rb.erb} +3 -1
  130. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  131. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  132. data/lib/generators/doorkeeper/templates/initializer.rb +410 -31
  133. data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
  134. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  135. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  136. metadata +132 -286
  137. data/.gitignore +0 -14
  138. data/.hound.yml +0 -13
  139. data/.rspec +0 -1
  140. data/.travis.yml +0 -20
  141. data/CONTRIBUTING.md +0 -47
  142. data/Gemfile +0 -14
  143. data/NEWS.md +0 -593
  144. data/RELEASING.md +0 -17
  145. data/Rakefile +0 -20
  146. data/app/validators/redirect_uri_validator.rb +0 -34
  147. data/doorkeeper.gemspec +0 -28
  148. data/lib/doorkeeper/oauth/client/methods.rb +0 -18
  149. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  150. data/lib/doorkeeper/oauth/request_concern.rb +0 -48
  151. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
  152. data/lib/generators/doorkeeper/templates/migration.rb +0 -68
  153. data/spec/controllers/application_metal_controller.rb +0 -10
  154. data/spec/controllers/applications_controller_spec.rb +0 -58
  155. data/spec/controllers/authorizations_controller_spec.rb +0 -189
  156. data/spec/controllers/protected_resources_controller_spec.rb +0 -300
  157. data/spec/controllers/token_info_controller_spec.rb +0 -52
  158. data/spec/controllers/tokens_controller_spec.rb +0 -88
  159. data/spec/dummy/Rakefile +0 -7
  160. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  161. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  162. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  163. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  164. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  165. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  166. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  167. data/spec/dummy/app/models/user.rb +0 -5
  168. data/spec/dummy/app/views/home/index.html.erb +0 -0
  169. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  170. data/spec/dummy/config/application.rb +0 -23
  171. data/spec/dummy/config/boot.rb +0 -9
  172. data/spec/dummy/config/database.yml +0 -15
  173. data/spec/dummy/config/environment.rb +0 -5
  174. data/spec/dummy/config/environments/development.rb +0 -29
  175. data/spec/dummy/config/environments/production.rb +0 -62
  176. data/spec/dummy/config/environments/test.rb +0 -44
  177. data/spec/dummy/config/initializers/active_record_belongs_to_required_by_default.rb +0 -6
  178. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  179. data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
  180. data/spec/dummy/config/initializers/secret_token.rb +0 -9
  181. data/spec/dummy/config/initializers/session_store.rb +0 -8
  182. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  183. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  184. data/spec/dummy/config/routes.rb +0 -52
  185. data/spec/dummy/config.ru +0 -4
  186. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
  187. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
  188. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -60
  189. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -7
  190. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -11
  191. data/spec/dummy/db/schema.rb +0 -67
  192. data/spec/dummy/public/404.html +0 -26
  193. data/spec/dummy/public/422.html +0 -26
  194. data/spec/dummy/public/500.html +0 -26
  195. data/spec/dummy/public/favicon.ico +0 -0
  196. data/spec/dummy/script/rails +0 -6
  197. data/spec/factories.rb +0 -28
  198. data/spec/generators/application_owner_generator_spec.rb +0 -22
  199. data/spec/generators/install_generator_spec.rb +0 -31
  200. data/spec/generators/migration_generator_spec.rb +0 -20
  201. data/spec/generators/templates/routes.rb +0 -3
  202. data/spec/generators/views_generator_spec.rb +0 -27
  203. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  204. data/spec/lib/config_spec.rb +0 -334
  205. data/spec/lib/doorkeeper_spec.rb +0 -28
  206. data/spec/lib/models/expirable_spec.rb +0 -51
  207. data/spec/lib/models/revocable_spec.rb +0 -59
  208. data/spec/lib/models/scopes_spec.rb +0 -43
  209. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -42
  210. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
  211. data/spec/lib/oauth/client/credentials_spec.rb +0 -47
  212. data/spec/lib/oauth/client/methods_spec.rb +0 -54
  213. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  214. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  215. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  216. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  217. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
  218. data/spec/lib/oauth/client_spec.rb +0 -39
  219. data/spec/lib/oauth/code_request_spec.rb +0 -45
  220. data/spec/lib/oauth/code_response_spec.rb +0 -34
  221. data/spec/lib/oauth/error_response_spec.rb +0 -61
  222. data/spec/lib/oauth/error_spec.rb +0 -23
  223. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
  224. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
  225. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
  226. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -104
  227. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -28
  228. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -90
  229. data/spec/lib/oauth/pre_authorization_spec.rb +0 -155
  230. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -154
  231. data/spec/lib/oauth/scopes_spec.rb +0 -122
  232. data/spec/lib/oauth/token_request_spec.rb +0 -98
  233. data/spec/lib/oauth/token_response_spec.rb +0 -85
  234. data/spec/lib/oauth/token_spec.rb +0 -116
  235. data/spec/lib/request/strategy_spec.rb +0 -53
  236. data/spec/lib/server_spec.rb +0 -52
  237. data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
  238. data/spec/models/doorkeeper/access_token_spec.rb +0 -394
  239. data/spec/models/doorkeeper/application_spec.rb +0 -179
  240. data/spec/requests/applications/applications_request_spec.rb +0 -94
  241. data/spec/requests/applications/authorized_applications_spec.rb +0 -30
  242. data/spec/requests/endpoints/authorization_spec.rb +0 -72
  243. data/spec/requests/endpoints/token_spec.rb +0 -64
  244. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -66
  245. data/spec/requests/flows/authorization_code_spec.rb +0 -156
  246. data/spec/requests/flows/client_credentials_spec.rb +0 -58
  247. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
  248. data/spec/requests/flows/implicit_grant_spec.rb +0 -61
  249. data/spec/requests/flows/password_spec.rb +0 -115
  250. data/spec/requests/flows/refresh_token_spec.rb +0 -174
  251. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  252. data/spec/requests/flows/skip_authorization_spec.rb +0 -59
  253. data/spec/requests/protected_resources/metal_spec.rb +0 -14
  254. data/spec/requests/protected_resources/private_api_spec.rb +0 -81
  255. data/spec/routing/custom_controller_routes_spec.rb +0 -71
  256. data/spec/routing/default_routes_spec.rb +0 -35
  257. data/spec/routing/scoped_routes_spec.rb +0 -31
  258. data/spec/spec_helper.rb +0 -2
  259. data/spec/spec_helper_integration.rb +0 -59
  260. data/spec/support/dependencies/factory_girl.rb +0 -2
  261. data/spec/support/helpers/access_token_request_helper.rb +0 -11
  262. data/spec/support/helpers/authorization_request_helper.rb +0 -41
  263. data/spec/support/helpers/config_helper.rb +0 -9
  264. data/spec/support/helpers/model_helper.rb +0 -67
  265. data/spec/support/helpers/request_spec_helper.rb +0 -76
  266. data/spec/support/helpers/url_helper.rb +0 -55
  267. data/spec/support/http_method_shim.rb +0 -24
  268. data/spec/support/orm/active_record.rb +0 -3
  269. data/spec/support/shared/controllers_shared_context.rb +0 -69
  270. data/spec/support/shared/models_shared_examples.rb +0 -52
  271. data/spec/validators/redirect_uri_validator_spec.rb +0 -78
@@ -1,394 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper
4
- describe AccessToken do
5
- subject { FactoryGirl.build(:access_token) }
6
-
7
- it { expect(subject).to be_valid }
8
-
9
- it_behaves_like 'an accessible token'
10
- it_behaves_like 'a revocable token'
11
- it_behaves_like 'a unique token' do
12
- let(:factory_name) { :access_token }
13
- end
14
-
15
- module CustomGeneratorArgs
16
- def self.generate
17
- end
18
- end
19
-
20
- describe :generate_token do
21
- it 'generates a token using the default method' do
22
- FactoryGirl.create :access_token
23
-
24
- token = FactoryGirl.create :access_token
25
- expect(token.token).to be_a(String)
26
- end
27
-
28
- it 'generates a token using a custom object' do
29
- eigenclass = class << CustomGeneratorArgs; self; end
30
- eigenclass.class_eval do
31
- remove_method :generate
32
- end
33
- module CustomGeneratorArgs
34
- def self.generate(opts = {})
35
- "custom_generator_token_#{opts[:resource_owner_id]}"
36
- end
37
- end
38
-
39
- Doorkeeper.configure do
40
- orm DOORKEEPER_ORM
41
- access_token_generator "Doorkeeper::CustomGeneratorArgs"
42
- end
43
-
44
- token = FactoryGirl.create :access_token
45
- expect(token.token).to match(%r{custom_generator_token_\d+})
46
- end
47
-
48
- it 'allows the custom generator to access the application details' do
49
- eigenclass = class << CustomGeneratorArgs; self; end
50
- eigenclass.class_eval do
51
- remove_method :generate
52
- end
53
- module CustomGeneratorArgs
54
- def self.generate(opts = {})
55
- "custom_generator_token_#{opts[:application].name}"
56
- end
57
- end
58
-
59
- Doorkeeper.configure do
60
- orm DOORKEEPER_ORM
61
- access_token_generator "Doorkeeper::CustomGeneratorArgs"
62
- end
63
-
64
- token = FactoryGirl.create :access_token
65
- expect(token.token).to match(%r{custom_generator_token_Application \d+})
66
- end
67
-
68
- it 'allows the custom generator to access the scopes' do
69
- eigenclass = class << CustomGeneratorArgs; self; end
70
- eigenclass.class_eval do
71
- remove_method :generate
72
- end
73
- module CustomGeneratorArgs
74
- def self.generate(opts = {})
75
- "custom_generator_token_#{opts[:scopes].count}_#{opts[:scopes]}"
76
- end
77
- end
78
-
79
- Doorkeeper.configure do
80
- orm DOORKEEPER_ORM
81
- access_token_generator "Doorkeeper::CustomGeneratorArgs"
82
- end
83
-
84
- token = FactoryGirl.create :access_token, scopes: 'public write'
85
-
86
- expect(token.token).to eq 'custom_generator_token_2_public write'
87
- end
88
-
89
- it 'allows the custom generator to access the expiry length' do
90
- eigenclass = class << CustomGeneratorArgs; self; end
91
- eigenclass.class_eval do
92
- remove_method :generate
93
- end
94
- module CustomGeneratorArgs
95
- def self.generate(opts = {})
96
- "custom_generator_token_#{opts[:expires_in]}"
97
- end
98
- end
99
-
100
- Doorkeeper.configure do
101
- orm DOORKEEPER_ORM
102
- access_token_generator "Doorkeeper::CustomGeneratorArgs"
103
- end
104
-
105
- token = FactoryGirl.create :access_token
106
- expect(token.token).to eq 'custom_generator_token_7200'
107
- end
108
-
109
- it 'allows the custom generator to access the created time' do
110
- module CustomGeneratorArgs
111
- def self.generate(opts = {})
112
- "custom_generator_token_#{opts[:created_at].to_i}"
113
- end
114
- end
115
-
116
- Doorkeeper.configure do
117
- orm DOORKEEPER_ORM
118
- access_token_generator "Doorkeeper::CustomGeneratorArgs"
119
- end
120
-
121
- token = FactoryGirl.create :access_token
122
- created_at = token.created_at
123
- expect(token.token).to eq "custom_generator_token_#{created_at.to_i}"
124
- end
125
-
126
- it 'raises an error if the custom object does not support generate' do
127
- module NoGenerate
128
- end
129
-
130
- Doorkeeper.configure do
131
- orm DOORKEEPER_ORM
132
- access_token_generator "Doorkeeper::NoGenerate"
133
- end
134
-
135
- expect { FactoryGirl.create :access_token }.to(
136
- raise_error(Doorkeeper::Errors::UnableToGenerateToken))
137
- end
138
-
139
- it 'raises an error if the custom object does not exist' do
140
- Doorkeeper.configure do
141
- orm DOORKEEPER_ORM
142
- access_token_generator "Doorkeeper::NotReal"
143
- end
144
-
145
- expect { FactoryGirl.create :access_token }.to(
146
- raise_error(Doorkeeper::Errors::TokenGeneratorNotFound))
147
- end
148
- end
149
-
150
- describe :refresh_token do
151
- it 'has empty refresh token if it was not required' do
152
- token = FactoryGirl.create :access_token
153
- expect(token.refresh_token).to be_nil
154
- end
155
-
156
- it 'generates a refresh token if it was requested' do
157
- token = FactoryGirl.create :access_token, use_refresh_token: true
158
- expect(token.refresh_token).not_to be_nil
159
- end
160
-
161
- it 'is not valid if token exists' do
162
- token1 = FactoryGirl.create :access_token, use_refresh_token: true
163
- token2 = FactoryGirl.create :access_token, use_refresh_token: true
164
- token2.refresh_token = token1.refresh_token
165
- expect(token2).not_to be_valid
166
- end
167
-
168
- it 'expects database to raise an error if refresh tokens are the same' do
169
- token1 = FactoryGirl.create :access_token, use_refresh_token: true
170
- token2 = FactoryGirl.create :access_token, use_refresh_token: true
171
- expect do
172
- token2.refresh_token = token1.refresh_token
173
- token2.save(validate: false)
174
- end.to raise_error(uniqueness_error)
175
- end
176
- end
177
-
178
- describe 'validations' do
179
- it 'is valid without resource_owner_id' do
180
- # For client credentials flow
181
- subject.resource_owner_id = nil
182
- expect(subject).to be_valid
183
- end
184
-
185
- it 'is valid without application_id' do
186
- # For resource owner credentials flow
187
- subject.application_id = nil
188
- expect(subject).to be_valid
189
- end
190
- end
191
-
192
- describe '#same_credential?' do
193
-
194
- context 'with default parameters' do
195
-
196
- let(:resource_owner_id) { 100 }
197
- let(:application) { FactoryGirl.create :application }
198
- let(:default_attributes) do
199
- { application: application, resource_owner_id: resource_owner_id }
200
- end
201
- let(:access_token1) { FactoryGirl.create :access_token, default_attributes }
202
-
203
- context 'the second token has the same owner and same app' do
204
- let(:access_token2) { FactoryGirl.create :access_token, default_attributes }
205
- it 'success' do
206
- expect(access_token1.same_credential?(access_token2)).to be_truthy
207
- end
208
- end
209
-
210
- context 'the second token has same owner and different app' do
211
- let(:other_application) { FactoryGirl.create :application }
212
- let(:access_token2) { FactoryGirl.create :access_token, application: other_application, resource_owner_id: resource_owner_id }
213
-
214
- it 'fail' do
215
- expect(access_token1.same_credential?(access_token2)).to be_falsey
216
- end
217
- end
218
-
219
- context 'the second token has different owner and different app' do
220
-
221
- let(:other_application) { FactoryGirl.create :application }
222
- let(:access_token2) { FactoryGirl.create :access_token, application: other_application, resource_owner_id: 42 }
223
-
224
- it 'fail' do
225
- expect(access_token1.same_credential?(access_token2)).to be_falsey
226
- end
227
- end
228
-
229
- context 'the second token has different owner and same app' do
230
- let(:access_token2) { FactoryGirl.create :access_token, application: application, resource_owner_id: 42 }
231
-
232
- it 'fail' do
233
- expect(access_token1.same_credential?(access_token2)).to be_falsey
234
- end
235
- end
236
- end
237
- end
238
-
239
- describe '#acceptable?' do
240
- context 'a token that is not accessible' do
241
- let(:token) { FactoryGirl.create(:access_token, created_at: 6.hours.ago) }
242
-
243
- it 'should return false' do
244
- expect(token.acceptable?(nil)).to be false
245
- end
246
- end
247
-
248
- context 'a token that has the incorrect scopes' do
249
- let(:token) { FactoryGirl.create(:access_token) }
250
-
251
- it 'should return false' do
252
- expect(token.acceptable?(['public'])).to be false
253
- end
254
- end
255
-
256
- context 'a token is acceptable with the correct scopes' do
257
- let(:token) do
258
- token = FactoryGirl.create(:access_token)
259
- token[:scopes] = 'public'
260
- token
261
- end
262
-
263
- it 'should return true' do
264
- expect(token.acceptable?(['public'])).to be true
265
- end
266
- end
267
- end
268
-
269
- describe '.revoke_all_for' do
270
- let(:resource_owner) { double(id: 100) }
271
- let(:application) { FactoryGirl.create :application }
272
- let(:default_attributes) do
273
- { application: application, resource_owner_id: resource_owner.id }
274
- end
275
-
276
- it 'revokes all tokens for given application and resource owner' do
277
- FactoryGirl.create :access_token, default_attributes
278
- AccessToken.revoke_all_for application.id, resource_owner
279
- AccessToken.all.each do |token|
280
- expect(token).to be_revoked
281
- end
282
- end
283
-
284
- it 'matches application' do
285
- FactoryGirl.create :access_token, default_attributes.merge(application: FactoryGirl.create(:application))
286
- AccessToken.revoke_all_for application.id, resource_owner
287
- expect(AccessToken.all).not_to be_empty
288
- end
289
-
290
- it 'matches resource owner' do
291
- FactoryGirl.create :access_token, default_attributes.merge(resource_owner_id: 90)
292
- AccessToken.revoke_all_for application.id, resource_owner
293
- expect(AccessToken.all).not_to be_empty
294
- end
295
- end
296
-
297
- describe '.matching_token_for' do
298
- let(:resource_owner_id) { 100 }
299
- let(:application) { FactoryGirl.create :application }
300
- let(:scopes) { Doorkeeper::OAuth::Scopes.from_string('public write') }
301
- let(:default_attributes) do
302
- {
303
- application: application,
304
- resource_owner_id: resource_owner_id,
305
- scopes: scopes.to_s
306
- }
307
- end
308
-
309
- it 'returns only one token' do
310
- token = FactoryGirl.create :access_token, default_attributes
311
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
312
- expect(last_token).to eq(token)
313
- end
314
-
315
- it 'accepts resource owner as object' do
316
- resource_owner = double(to_key: true, id: 100)
317
- token = FactoryGirl.create :access_token, default_attributes
318
- last_token = AccessToken.matching_token_for(application, resource_owner, scopes)
319
- expect(last_token).to eq(token)
320
- end
321
-
322
- it 'accepts nil as resource owner' do
323
- token = FactoryGirl.create :access_token, default_attributes.merge(resource_owner_id: nil)
324
- last_token = AccessToken.matching_token_for(application, nil, scopes)
325
- expect(last_token).to eq(token)
326
- end
327
-
328
- it 'excludes revoked tokens' do
329
- FactoryGirl.create :access_token, default_attributes.merge(revoked_at: 1.day.ago)
330
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
331
- expect(last_token).to be_nil
332
- end
333
-
334
- it 'matches the application' do
335
- FactoryGirl.create :access_token, default_attributes.merge(application: FactoryGirl.create(:application))
336
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
337
- expect(last_token).to be_nil
338
- end
339
-
340
- it 'matches the resource owner' do
341
- FactoryGirl.create :access_token, default_attributes.merge(resource_owner_id: 2)
342
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
343
- expect(last_token).to be_nil
344
- end
345
-
346
- it 'matches token with fewer scopes' do
347
- FactoryGirl.create :access_token, default_attributes.merge(scopes: 'public')
348
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
349
- expect(last_token).to be_nil
350
- end
351
-
352
- it 'matches token with different scopes' do
353
- FactoryGirl.create :access_token, default_attributes.merge(scopes: 'public email')
354
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
355
- expect(last_token).to be_nil
356
- end
357
-
358
- it 'matches token with more scopes' do
359
- FactoryGirl.create :access_token, default_attributes.merge(scopes: 'public write email')
360
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
361
- expect(last_token).to be_nil
362
- end
363
-
364
- it 'matches application scopes' do
365
- application = FactoryGirl.create :application, scopes: "private read"
366
- FactoryGirl.create :access_token, default_attributes.merge(
367
- application: application
368
- )
369
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
370
- expect(last_token).to be_nil
371
- end
372
-
373
- it 'returns the last created token' do
374
- FactoryGirl.create :access_token, default_attributes.merge(created_at: 1.day.ago)
375
- token = FactoryGirl.create :access_token, default_attributes
376
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
377
- expect(last_token).to eq(token)
378
- end
379
-
380
- it 'returns as_json hash' do
381
- token = FactoryGirl.create :access_token, default_attributes
382
- token_hash = {
383
- resource_owner_id: token.resource_owner_id,
384
- scopes: token.scopes,
385
- expires_in_seconds: token.expires_in_seconds,
386
- application: { uid: token.application.uid },
387
- created_at: token.created_at.to_i,
388
- }
389
- expect(token.as_json).to eq token_hash
390
- end
391
- end
392
-
393
- end
394
- end
@@ -1,179 +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) { FactoryGirl.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 = FactoryGirl.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 'generates uid on create' do
53
- expect(new_application.uid).to be_nil
54
- new_application.save
55
- expect(new_application.uid).not_to be_nil
56
- end
57
-
58
- it 'generates uid on create if an empty string' do
59
- new_application.uid = ''
60
- new_application.save
61
- expect(new_application.uid).not_to be_blank
62
- end
63
-
64
- it 'generates uid on create unless one is set' do
65
- new_application.uid = uid
66
- new_application.save
67
- expect(new_application.uid).to eq(uid)
68
- end
69
-
70
- it 'is invalid without uid' do
71
- new_application.save
72
- new_application.uid = nil
73
- expect(new_application).not_to be_valid
74
- end
75
-
76
- it 'is invalid without redirect_uri' do
77
- new_application.save
78
- new_application.redirect_uri = nil
79
- expect(new_application).not_to be_valid
80
- end
81
-
82
- it 'checks uniqueness of uid' do
83
- app1 = FactoryGirl.create(:application)
84
- app2 = FactoryGirl.create(:application)
85
- app2.uid = app1.uid
86
- expect(app2).not_to be_valid
87
- end
88
-
89
- it 'expects database to throw an error when uids are the same' do
90
- app1 = FactoryGirl.create(:application)
91
- app2 = FactoryGirl.create(:application)
92
- app2.uid = app1.uid
93
- expect { app2.save!(validate: false) }.to raise_error(uniqueness_error)
94
- end
95
-
96
- it 'generate secret on create' do
97
- expect(new_application.secret).to be_nil
98
- new_application.save
99
- expect(new_application.secret).not_to be_nil
100
- end
101
-
102
- it 'generate secret on create if is blank string' do
103
- new_application.secret = ''
104
- new_application.save
105
- expect(new_application.secret).not_to be_blank
106
- end
107
-
108
- it 'generate secret on create unless one is set' do
109
- new_application.secret = secret
110
- new_application.save
111
- expect(new_application.secret).to eq(secret)
112
- end
113
-
114
- it 'is invalid without secret' do
115
- new_application.save
116
- new_application.secret = nil
117
- expect(new_application).not_to be_valid
118
- end
119
-
120
- describe 'destroy related models on cascade' do
121
- before(:each) do
122
- new_application.save
123
- end
124
-
125
- it 'should destroy its access grants' do
126
- FactoryGirl.create(:access_grant, application: new_application)
127
- expect { new_application.destroy }.to change { Doorkeeper::AccessGrant.count }.by(-1)
128
- end
129
-
130
- it 'should destroy its access tokens' do
131
- FactoryGirl.create(:access_token, application: new_application)
132
- FactoryGirl.create(:access_token, application: new_application, revoked_at: Time.now.utc)
133
- expect do
134
- new_application.destroy
135
- end.to change { Doorkeeper::AccessToken.count }.by(-2)
136
- end
137
- end
138
-
139
- describe :authorized_for do
140
- let(:resource_owner) { double(:resource_owner, id: 10) }
141
-
142
- it 'is empty if the application is not authorized for anyone' do
143
- expect(Application.authorized_for(resource_owner)).to be_empty
144
- end
145
-
146
- it 'returns only application for a specific resource owner' do
147
- FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id + 1)
148
- token = FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id)
149
- expect(Application.authorized_for(resource_owner)).to eq([token.application])
150
- end
151
-
152
- it 'excludes revoked tokens' do
153
- FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id, revoked_at: 2.days.ago)
154
- expect(Application.authorized_for(resource_owner)).to be_empty
155
- end
156
-
157
- it 'returns all applications that have been authorized' do
158
- token1 = FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id)
159
- token2 = FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id)
160
- expect(Application.authorized_for(resource_owner)).to eq([token1.application, token2.application])
161
- end
162
-
163
- it 'returns only one application even if it has been authorized twice' do
164
- application = FactoryGirl.create(:application)
165
- FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id, application: application)
166
- FactoryGirl.create(:access_token, resource_owner_id: resource_owner.id, application: application)
167
- expect(Application.authorized_for(resource_owner)).to eq([application])
168
- end
169
- end
170
-
171
- describe :authenticate do
172
- it 'finds the application via uid/secret' do
173
- app = FactoryGirl.create :application
174
- authenticated = Application.by_uid_and_secret(app.uid, app.secret)
175
- expect(authenticated).to eq(app)
176
- end
177
- end
178
- end
179
- 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
- FactoryGirl.create :application, name: 'Oauth Dude'
29
- FactoryGirl.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
- FactoryGirl.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
- FactoryGirl.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 = FactoryGirl.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