doorkeeper 3.1.0 → 5.6.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 (270) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1079 -0
  3. data/README.md +114 -326
  4. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +7 -6
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +9 -12
  7. data/app/controllers/doorkeeper/applications_controller.rb +66 -21
  8. data/app/controllers/doorkeeper/authorizations_controller.rb +100 -18
  9. data/app/controllers/doorkeeper/authorized_applications_controller.rb +23 -4
  10. data/app/controllers/doorkeeper/token_info_controller.rb +16 -4
  11. data/app/controllers/doorkeeper/tokens_controller.rb +138 -22
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +15 -9
  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 +17 -11
  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 +37 -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 +602 -142
  30. data/lib/doorkeeper/engine.rb +22 -7
  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 +99 -16
  40. data/lib/doorkeeper/models/access_token_mixin.rb +386 -77
  41. data/lib/doorkeeper/models/application_mixin.rb +73 -30
  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/expiration_time_sql_math.rb +88 -0
  45. data/lib/doorkeeper/models/concerns/orderable.rb +15 -0
  46. data/lib/doorkeeper/models/concerns/ownership.rb +4 -2
  47. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  48. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  49. data/lib/doorkeeper/models/concerns/revocable.rb +13 -2
  50. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  51. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  52. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  53. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  54. data/lib/doorkeeper/oauth/authorization/token.rb +72 -28
  55. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
  56. data/lib/doorkeeper/oauth/authorization_code_request.rb +64 -14
  57. data/lib/doorkeeper/oauth/base_request.rb +66 -0
  58. data/lib/doorkeeper/oauth/base_response.rb +31 -0
  59. data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
  60. data/lib/doorkeeper/oauth/client.rb +10 -12
  61. data/lib/doorkeeper/oauth/client_credentials/creator.rb +48 -4
  62. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +17 -9
  63. data/lib/doorkeeper/oauth/client_credentials/validator.rb +55 -0
  64. data/lib/doorkeeper/oauth/client_credentials_request.rb +14 -15
  65. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  66. data/lib/doorkeeper/oauth/code_response.rb +31 -19
  67. data/lib/doorkeeper/oauth/error.rb +5 -3
  68. data/lib/doorkeeper/oauth/error_response.rb +41 -20
  69. data/lib/doorkeeper/oauth/forbidden_token_response.rb +11 -3
  70. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +24 -19
  71. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  72. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +55 -4
  73. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  74. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  75. data/lib/doorkeeper/oauth/invalid_token_response.rb +31 -5
  76. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  77. data/lib/doorkeeper/oauth/password_access_token_request.rb +46 -18
  78. data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
  79. data/lib/doorkeeper/oauth/refresh_token_request.rb +67 -30
  80. data/lib/doorkeeper/oauth/scopes.rb +26 -12
  81. data/lib/doorkeeper/oauth/token.rb +28 -25
  82. data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
  83. data/lib/doorkeeper/oauth/token_request.rb +8 -21
  84. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  85. data/lib/doorkeeper/oauth.rb +13 -0
  86. data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
  87. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -17
  88. data/lib/doorkeeper/orm/active_record/application.rb +6 -20
  89. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +69 -0
  90. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +81 -0
  91. data/lib/doorkeeper/orm/active_record/mixins/application.rb +214 -0
  92. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  93. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  94. data/lib/doorkeeper/orm/active_record.rb +36 -26
  95. data/lib/doorkeeper/rails/helpers.rb +14 -15
  96. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  97. data/lib/doorkeeper/rails/routes/mapper.rb +4 -2
  98. data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
  99. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  100. data/lib/doorkeeper/rails/routes.rb +45 -28
  101. data/lib/doorkeeper/rake/db.rake +40 -0
  102. data/lib/doorkeeper/rake/setup.rake +6 -0
  103. data/lib/doorkeeper/rake.rb +14 -0
  104. data/lib/doorkeeper/request/authorization_code.rb +12 -4
  105. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  106. data/lib/doorkeeper/request/code.rb +1 -1
  107. data/lib/doorkeeper/request/password.rb +5 -4
  108. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  109. data/lib/doorkeeper/request/strategy.rb +4 -2
  110. data/lib/doorkeeper/request/token.rb +1 -1
  111. data/lib/doorkeeper/request.rb +62 -29
  112. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  113. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  114. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  115. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  116. data/lib/doorkeeper/server.rb +9 -19
  117. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  118. data/lib/doorkeeper/validations.rb +5 -2
  119. data/lib/doorkeeper/version.rb +12 -1
  120. data/lib/doorkeeper.rb +112 -56
  121. data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
  122. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  123. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  124. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  125. data/lib/generators/doorkeeper/migration_generator.rb +27 -10
  126. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  127. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +41 -0
  128. data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
  129. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
  130. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +13 -0
  131. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  132. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  133. data/lib/generators/doorkeeper/templates/initializer.rb +417 -32
  134. data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
  135. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  136. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  137. metadata +163 -280
  138. data/.gitignore +0 -14
  139. data/.hound.yml +0 -13
  140. data/.rspec +0 -1
  141. data/.travis.yml +0 -22
  142. data/CONTRIBUTING.md +0 -45
  143. data/Gemfile +0 -10
  144. data/NEWS.md +0 -525
  145. data/RELEASING.md +0 -17
  146. data/Rakefile +0 -20
  147. data/app/validators/redirect_uri_validator.rb +0 -34
  148. data/doorkeeper.gemspec +0 -27
  149. data/lib/doorkeeper/oauth/client/methods.rb +0 -18
  150. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  151. data/lib/doorkeeper/oauth/request_concern.rb +0 -48
  152. data/lib/generators/doorkeeper/application_scopes_generator.rb +0 -34
  153. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
  154. data/lib/generators/doorkeeper/templates/add_scopes_to_oauth_applications.rb +0 -5
  155. data/lib/generators/doorkeeper/templates/migration.rb +0 -50
  156. data/spec/controllers/applications_controller_spec.rb +0 -58
  157. data/spec/controllers/authorizations_controller_spec.rb +0 -203
  158. data/spec/controllers/protected_resources_controller_spec.rb +0 -271
  159. data/spec/controllers/token_info_controller_spec.rb +0 -52
  160. data/spec/controllers/tokens_controller_spec.rb +0 -88
  161. data/spec/dummy/Rakefile +0 -7
  162. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  163. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  164. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  165. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  166. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  167. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  168. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  169. data/spec/dummy/app/models/user.rb +0 -9
  170. data/spec/dummy/app/views/home/index.html.erb +0 -0
  171. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  172. data/spec/dummy/config/application.rb +0 -57
  173. data/spec/dummy/config/boot.rb +0 -9
  174. data/spec/dummy/config/database.yml +0 -15
  175. data/spec/dummy/config/environment.rb +0 -5
  176. data/spec/dummy/config/environments/development.rb +0 -29
  177. data/spec/dummy/config/environments/production.rb +0 -62
  178. data/spec/dummy/config/environments/test.rb +0 -55
  179. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  180. data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
  181. data/spec/dummy/config/initializers/secret_token.rb +0 -9
  182. data/spec/dummy/config/initializers/session_store.rb +0 -8
  183. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  184. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  185. data/spec/dummy/config/routes.rb +0 -52
  186. data/spec/dummy/config.ru +0 -4
  187. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
  188. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
  189. data/spec/dummy/db/migrate/20130902165751_create_doorkeeper_tables.rb +0 -41
  190. data/spec/dummy/db/migrate/20130902175349_add_owner_to_application.rb +0 -7
  191. data/spec/dummy/db/migrate/20141209001746_add_scopes_to_oauth_applications.rb +0 -5
  192. data/spec/dummy/db/schema.rb +0 -66
  193. data/spec/dummy/public/404.html +0 -26
  194. data/spec/dummy/public/422.html +0 -26
  195. data/spec/dummy/public/500.html +0 -26
  196. data/spec/dummy/public/favicon.ico +0 -0
  197. data/spec/dummy/script/rails +0 -6
  198. data/spec/factories.rb +0 -26
  199. data/spec/generators/application_owner_generator_spec.rb +0 -22
  200. data/spec/generators/install_generator_spec.rb +0 -31
  201. data/spec/generators/migration_generator_spec.rb +0 -20
  202. data/spec/generators/templates/routes.rb +0 -3
  203. data/spec/generators/views_generator_spec.rb +0 -27
  204. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  205. data/spec/lib/config_spec.rb +0 -317
  206. data/spec/lib/doorkeeper_spec.rb +0 -28
  207. data/spec/lib/models/expirable_spec.rb +0 -51
  208. data/spec/lib/models/revocable_spec.rb +0 -36
  209. data/spec/lib/models/scopes_spec.rb +0 -43
  210. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -42
  211. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
  212. data/spec/lib/oauth/client/credentials_spec.rb +0 -47
  213. data/spec/lib/oauth/client/methods_spec.rb +0 -54
  214. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  215. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  216. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  217. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  218. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
  219. data/spec/lib/oauth/client_spec.rb +0 -39
  220. data/spec/lib/oauth/code_request_spec.rb +0 -45
  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 -123
  231. data/spec/lib/oauth/scopes_spec.rb +0 -123
  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 -109
  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 -350
  239. data/spec/models/doorkeeper/application_spec.rb +0 -187
  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 -94
  250. data/spec/requests/flows/refresh_token_spec.rb +0 -104
  251. data/spec/requests/flows/revoke_token_spec.rb +0 -143
  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 -56
  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 -45
  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/orm/active_record.rb +0 -3
  268. data/spec/support/shared/controllers_shared_context.rb +0 -60
  269. data/spec/support/shared/models_shared_examples.rb +0 -52
  270. data/spec/validators/redirect_uri_validator_spec.rb +0 -78
@@ -1,350 +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
- describe :generate_token do
16
- it 'generates a token using the default method' do
17
- FactoryGirl.create :access_token
18
-
19
- token = FactoryGirl.create :access_token
20
- expect(token.token).to be_a(String)
21
- end
22
-
23
- it 'generates a token using a custom object' do
24
- module CustomGeneratorArgs
25
- def self.generate(opts = {})
26
- "custom_generator_token_#{opts[:resource_owner_id]}"
27
- end
28
- end
29
-
30
- Doorkeeper.configure do
31
- orm DOORKEEPER_ORM
32
- access_token_generator "Doorkeeper::CustomGeneratorArgs"
33
- end
34
-
35
- token = FactoryGirl.create :access_token
36
- expect(token.token).to match(%r{custom_generator_token_\d+})
37
- end
38
-
39
- it 'allows the custom generator to access the application details' do
40
- module CustomGeneratorArgs
41
- def self.generate(opts = {})
42
- "custom_generator_token_#{opts[:application].name}"
43
- end
44
- end
45
-
46
- Doorkeeper.configure do
47
- orm DOORKEEPER_ORM
48
- access_token_generator "Doorkeeper::CustomGeneratorArgs"
49
- end
50
-
51
- token = FactoryGirl.create :access_token
52
- expect(token.token).to match(%r{custom_generator_token_Application \d+})
53
- end
54
-
55
- it 'allows the custom generator to access the scopes' do
56
- module CustomGeneratorArgs
57
- def self.generate(opts = {})
58
- "custom_generator_token_#{opts[:scopes].count}_#{opts[:scopes]}"
59
- end
60
- end
61
-
62
- Doorkeeper.configure do
63
- orm DOORKEEPER_ORM
64
- access_token_generator "Doorkeeper::CustomGeneratorArgs"
65
- end
66
-
67
- token = FactoryGirl.create :access_token, scopes: 'public write'
68
-
69
- expect(token.token).to eq 'custom_generator_token_2_public write'
70
- end
71
-
72
- it 'allows the custom generator to access the expiry length' do
73
- module CustomGeneratorArgs
74
- def self.generate(opts = {})
75
- "custom_generator_token_#{opts[:expires_in]}"
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
85
- expect(token.token).to eq 'custom_generator_token_7200'
86
- end
87
-
88
- it 'raises an error if the custom object does not support generate' do
89
- module NoGenerate
90
- end
91
-
92
- Doorkeeper.configure do
93
- orm DOORKEEPER_ORM
94
- access_token_generator "Doorkeeper::NoGenerate"
95
- end
96
-
97
- expect { FactoryGirl.create :access_token }.to(
98
- raise_error(Doorkeeper::Errors::UnableToGenerateToken))
99
- end
100
-
101
- it 'raises an error if the custom object does not exist' do
102
- Doorkeeper.configure do
103
- orm DOORKEEPER_ORM
104
- access_token_generator "Doorkeeper::NotReal"
105
- end
106
-
107
- expect { FactoryGirl.create :access_token }.to(
108
- raise_error(Doorkeeper::Errors::TokenGeneratorNotFound))
109
- end
110
- end
111
-
112
- describe :refresh_token do
113
- it 'has empty refresh token if it was not required' do
114
- token = FactoryGirl.create :access_token
115
- expect(token.refresh_token).to be_nil
116
- end
117
-
118
- it 'generates a refresh token if it was requested' do
119
- token = FactoryGirl.create :access_token, use_refresh_token: true
120
- expect(token.refresh_token).not_to be_nil
121
- end
122
-
123
- it 'is not valid if token exists' do
124
- token1 = FactoryGirl.create :access_token, use_refresh_token: true
125
- token2 = FactoryGirl.create :access_token, use_refresh_token: true
126
- token2.refresh_token = token1.refresh_token
127
- expect(token2).not_to be_valid
128
- end
129
-
130
- it 'expects database to raise an error if refresh tokens are the same' do
131
- token1 = FactoryGirl.create :access_token, use_refresh_token: true
132
- token2 = FactoryGirl.create :access_token, use_refresh_token: true
133
- expect do
134
- token2.refresh_token = token1.refresh_token
135
- token2.save(validate: false)
136
- end.to raise_error(ActiveRecord::RecordNotUnique)
137
- end
138
- end
139
-
140
- describe 'validations' do
141
- it 'is valid without resource_owner_id' do
142
- # For client credentials flow
143
- subject.resource_owner_id = nil
144
- expect(subject).to be_valid
145
- end
146
- end
147
-
148
- describe '#same_credential?' do
149
-
150
- context 'with default parameters' do
151
-
152
- let(:resource_owner_id) { 100 }
153
- let(:application) { FactoryGirl.create :application }
154
- let(:default_attributes) do
155
- { application: application, resource_owner_id: resource_owner_id }
156
- end
157
- let(:access_token1) { FactoryGirl.create :access_token, default_attributes }
158
-
159
- context 'the second token has the same owner and same app' do
160
- let(:access_token2) { FactoryGirl.create :access_token, default_attributes }
161
- it 'success' do
162
- expect(access_token1.same_credential?(access_token2)).to be_truthy
163
- end
164
- end
165
-
166
- context 'the second token has same owner and different app' do
167
- let(:other_application) { FactoryGirl.create :application }
168
- let(:access_token2) { FactoryGirl.create :access_token, application: other_application, resource_owner_id: resource_owner_id }
169
-
170
- it 'fail' do
171
- expect(access_token1.same_credential?(access_token2)).to be_falsey
172
- end
173
- end
174
-
175
- context 'the second token has different owner and different app' do
176
-
177
- let(:other_application) { FactoryGirl.create :application }
178
- let(:access_token2) { FactoryGirl.create :access_token, application: other_application, resource_owner_id: 42 }
179
-
180
- it 'fail' do
181
- expect(access_token1.same_credential?(access_token2)).to be_falsey
182
- end
183
- end
184
-
185
- context 'the second token has different owner and same app' do
186
- let(:access_token2) { FactoryGirl.create :access_token, application: application, resource_owner_id: 42 }
187
-
188
- it 'fail' do
189
- expect(access_token1.same_credential?(access_token2)).to be_falsey
190
- end
191
- end
192
- end
193
- end
194
-
195
- describe '#acceptable?' do
196
- context 'a token that is not accessible' do
197
- let(:token) { FactoryGirl.create(:access_token, created_at: 6.hours.ago) }
198
-
199
- it 'should return false' do
200
- expect(token.acceptable?(nil)).to be false
201
- end
202
- end
203
-
204
- context 'a token that has the incorrect scopes' do
205
- let(:token) { FactoryGirl.create(:access_token) }
206
-
207
- it 'should return false' do
208
- expect(token.acceptable?(['public'])).to be false
209
- end
210
- end
211
-
212
- context 'a token is acceptable with the correct scopes' do
213
- let(:token) do
214
- token = FactoryGirl.create(:access_token)
215
- token[:scopes] = 'public'
216
- token
217
- end
218
-
219
- it 'should return true' do
220
- expect(token.acceptable?(['public'])).to be true
221
- end
222
- end
223
- end
224
-
225
- describe '.revoke_all_for' do
226
- let(:resource_owner) { double(id: 100) }
227
- let(:application) { FactoryGirl.create :application }
228
- let(:default_attributes) do
229
- { application: application, resource_owner_id: resource_owner.id }
230
- end
231
-
232
- it 'revokes all tokens for given application and resource owner' do
233
- FactoryGirl.create :access_token, default_attributes
234
- AccessToken.revoke_all_for application.id, resource_owner
235
- AccessToken.all.each do |token|
236
- expect(token).to be_revoked
237
- end
238
- end
239
-
240
- it 'matches application' do
241
- FactoryGirl.create :access_token, default_attributes.merge(application: FactoryGirl.create(:application))
242
- AccessToken.revoke_all_for application.id, resource_owner
243
- expect(AccessToken.all).not_to be_empty
244
- end
245
-
246
- it 'matches resource owner' do
247
- FactoryGirl.create :access_token, default_attributes.merge(resource_owner_id: 90)
248
- AccessToken.revoke_all_for application.id, resource_owner
249
- expect(AccessToken.all).not_to be_empty
250
- end
251
- end
252
-
253
- describe '.matching_token_for' do
254
- let(:resource_owner_id) { 100 }
255
- let(:application) { FactoryGirl.create :application }
256
- let(:scopes) { Doorkeeper::OAuth::Scopes.from_string('public write') }
257
- let(:default_attributes) do
258
- {
259
- application: application,
260
- resource_owner_id: resource_owner_id,
261
- scopes: scopes.to_s
262
- }
263
- end
264
-
265
- it 'returns only one token' do
266
- token = FactoryGirl.create :access_token, default_attributes
267
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
268
- expect(last_token).to eq(token)
269
- end
270
-
271
- it 'accepts resource owner as object' do
272
- resource_owner = double(to_key: true, id: 100)
273
- token = FactoryGirl.create :access_token, default_attributes
274
- last_token = AccessToken.matching_token_for(application, resource_owner, scopes)
275
- expect(last_token).to eq(token)
276
- end
277
-
278
- it 'accepts nil as resource owner' do
279
- token = FactoryGirl.create :access_token, default_attributes.merge(resource_owner_id: nil)
280
- last_token = AccessToken.matching_token_for(application, nil, scopes)
281
- expect(last_token).to eq(token)
282
- end
283
-
284
- it 'excludes revoked tokens' do
285
- FactoryGirl.create :access_token, default_attributes.merge(revoked_at: 1.day.ago)
286
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
287
- expect(last_token).to be_nil
288
- end
289
-
290
- it 'matches the application' do
291
- FactoryGirl.create :access_token, default_attributes.merge(application: FactoryGirl.create(:application))
292
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
293
- expect(last_token).to be_nil
294
- end
295
-
296
- it 'matches the resource owner' do
297
- FactoryGirl.create :access_token, default_attributes.merge(resource_owner_id: 2)
298
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
299
- expect(last_token).to be_nil
300
- end
301
-
302
- it 'matches token with fewer scopes' do
303
- FactoryGirl.create :access_token, default_attributes.merge(scopes: 'public')
304
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
305
- expect(last_token).to be_nil
306
- end
307
-
308
- it 'matches token with different scopes' do
309
- FactoryGirl.create :access_token, default_attributes.merge(scopes: 'public email')
310
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
311
- expect(last_token).to be_nil
312
- end
313
-
314
- it 'matches token with more scopes' do
315
- FactoryGirl.create :access_token, default_attributes.merge(scopes: 'public write email')
316
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
317
- expect(last_token).to be_nil
318
- end
319
-
320
- it 'matches application scopes' do
321
- application = FactoryGirl.create :application, scopes: "private read"
322
- FactoryGirl.create :access_token, default_attributes.merge(
323
- application: application
324
- )
325
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
326
- expect(last_token).to be_nil
327
- end
328
-
329
- it 'returns the last created token' do
330
- FactoryGirl.create :access_token, default_attributes.merge(created_at: 1.day.ago)
331
- token = FactoryGirl.create :access_token, default_attributes
332
- last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
333
- expect(last_token).to eq(token)
334
- end
335
-
336
- it 'returns as_json hash' do
337
- token = FactoryGirl.create :access_token, default_attributes
338
- token_hash = {
339
- resource_owner_id: token.resource_owner_id,
340
- scopes: token.scopes,
341
- expires_in_seconds: token.expires_in_seconds,
342
- application: { uid: token.application.uid },
343
- created_at: token.created_at.to_i,
344
- }
345
- expect(token.as_json).to eq token_hash
346
- end
347
- end
348
-
349
- end
350
- end
@@ -1,187 +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(: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(ActiveRecord::RecordNotUnique)
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)
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
-
170
- it 'should fail to mass assign a new application', if: ::Rails::VERSION::MAJOR < 4 do
171
- mass_assign = { name: 'Something',
172
- redirect_uri: 'http://somewhere.com/something',
173
- uid: 123,
174
- secret: 'something' }
175
- expect(Application.create(mass_assign).uid).not_to eq(123)
176
- end
177
- end
178
-
179
- describe :authenticate do
180
- it 'finds the application via uid/secret' do
181
- app = FactoryGirl.create :application
182
- authenticated = Application.by_uid_and_secret(app.uid, app.secret)
183
- expect(authenticated).to eq(app)
184
- end
185
- end
186
- end
187
- 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