doorkeeper 4.2.0 → 5.6.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (273) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1119 -0
  3. data/README.md +112 -349
  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 +115 -18
  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 +118 -38
  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 +4 -2
  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 +36 -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 +551 -155
  30. data/lib/doorkeeper/engine.rb +19 -6
  31. data/lib/doorkeeper/errors.rb +55 -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 +383 -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/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 -7
  47. data/lib/doorkeeper/models/concerns/polymorphic_resource_owner.rb +30 -0
  48. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  49. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  50. data/lib/doorkeeper/models/concerns/revocable.rb +12 -18
  51. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  52. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  53. data/lib/doorkeeper/oauth/authorization/code.rb +54 -12
  54. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  55. data/lib/doorkeeper/oauth/authorization/token.rb +72 -28
  56. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
  57. data/lib/doorkeeper/oauth/authorization_code_request.rb +77 -17
  58. data/lib/doorkeeper/oauth/base_request.rb +67 -0
  59. data/lib/doorkeeper/oauth/base_response.rb +31 -0
  60. data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
  61. data/lib/doorkeeper/oauth/client.rb +10 -12
  62. data/lib/doorkeeper/oauth/client_credentials/creator.rb +44 -4
  63. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +21 -13
  64. data/lib/doorkeeper/oauth/client_credentials/validator.rb +55 -0
  65. data/lib/doorkeeper/oauth/client_credentials_request.rb +20 -16
  66. data/lib/doorkeeper/oauth/code_request.rb +9 -13
  67. data/lib/doorkeeper/oauth/code_response.rb +28 -15
  68. data/lib/doorkeeper/oauth/error.rb +5 -3
  69. data/lib/doorkeeper/oauth/error_response.rb +43 -20
  70. data/lib/doorkeeper/oauth/forbidden_token_response.rb +11 -3
  71. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -18
  72. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  73. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +53 -3
  74. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  75. data/lib/doorkeeper/oauth/invalid_request_response.rb +47 -0
  76. data/lib/doorkeeper/oauth/invalid_token_response.rb +31 -5
  77. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  78. data/lib/doorkeeper/oauth/password_access_token_request.rb +46 -14
  79. data/lib/doorkeeper/oauth/pre_authorization.rb +138 -28
  80. data/lib/doorkeeper/oauth/refresh_token_request.rb +74 -41
  81. data/lib/doorkeeper/oauth/scopes.rb +26 -12
  82. data/lib/doorkeeper/oauth/token.rb +25 -23
  83. data/lib/doorkeeper/oauth/token_introspection.rb +204 -0
  84. data/lib/doorkeeper/oauth/token_request.rb +9 -22
  85. data/lib/doorkeeper/oauth/token_response.rb +13 -10
  86. data/lib/doorkeeper/oauth.rb +13 -0
  87. data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
  88. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -25
  89. data/lib/doorkeeper/orm/active_record/application.rb +6 -15
  90. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +63 -0
  91. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +77 -0
  92. data/lib/doorkeeper/orm/active_record/mixins/application.rb +210 -0
  93. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  94. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +36 -0
  95. data/lib/doorkeeper/orm/active_record.rb +34 -12
  96. data/lib/doorkeeper/rails/helpers.rb +14 -15
  97. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  98. data/lib/doorkeeper/rails/routes/mapper.rb +3 -1
  99. data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
  100. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  101. data/lib/doorkeeper/rails/routes.rb +50 -29
  102. data/lib/doorkeeper/rake/db.rake +40 -0
  103. data/lib/doorkeeper/rake/setup.rake +6 -0
  104. data/lib/doorkeeper/rake.rb +14 -0
  105. data/lib/doorkeeper/request/authorization_code.rb +12 -4
  106. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  107. data/lib/doorkeeper/request/code.rb +1 -1
  108. data/lib/doorkeeper/request/password.rb +5 -14
  109. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  110. data/lib/doorkeeper/request/strategy.rb +4 -2
  111. data/lib/doorkeeper/request/token.rb +1 -1
  112. data/lib/doorkeeper/request.rb +62 -29
  113. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  114. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  115. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  116. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  117. data/lib/doorkeeper/server.rb +9 -19
  118. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  119. data/lib/doorkeeper/validations.rb +5 -2
  120. data/lib/doorkeeper/version.rb +12 -1
  121. data/lib/doorkeeper.rb +180 -57
  122. data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
  123. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  124. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  125. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  126. data/lib/generators/doorkeeper/migration_generator.rb +27 -10
  127. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  128. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +31 -19
  129. data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
  130. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
  131. data/lib/generators/doorkeeper/templates/{add_previous_refresh_token_to_access_tokens.rb → add_previous_refresh_token_to_access_tokens.rb.erb} +3 -1
  132. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  133. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  134. data/lib/generators/doorkeeper/templates/initializer.rb +436 -33
  135. data/lib/generators/doorkeeper/templates/migration.rb.erb +98 -0
  136. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  137. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  138. metadata +129 -281
  139. data/.gitignore +0 -14
  140. data/.hound.yml +0 -13
  141. data/.rspec +0 -1
  142. data/.travis.yml +0 -20
  143. data/CONTRIBUTING.md +0 -47
  144. data/Gemfile +0 -14
  145. data/NEWS.md +0 -593
  146. data/RELEASING.md +0 -17
  147. data/Rakefile +0 -20
  148. data/app/validators/redirect_uri_validator.rb +0 -34
  149. data/doorkeeper.gemspec +0 -28
  150. data/lib/doorkeeper/oauth/client/methods.rb +0 -18
  151. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  152. data/lib/doorkeeper/oauth/request_concern.rb +0 -48
  153. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
  154. data/lib/generators/doorkeeper/templates/migration.rb +0 -68
  155. data/spec/controllers/application_metal_controller.rb +0 -10
  156. data/spec/controllers/applications_controller_spec.rb +0 -58
  157. data/spec/controllers/authorizations_controller_spec.rb +0 -189
  158. data/spec/controllers/protected_resources_controller_spec.rb +0 -300
  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 -5
  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 -23
  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 -44
  179. data/spec/dummy/config/initializers/active_record_belongs_to_required_by_default.rb +0 -6
  180. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  181. data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
  182. data/spec/dummy/config/initializers/secret_token.rb +0 -9
  183. data/spec/dummy/config/initializers/session_store.rb +0 -8
  184. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  185. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  186. data/spec/dummy/config/routes.rb +0 -52
  187. data/spec/dummy/config.ru +0 -4
  188. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
  189. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
  190. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -60
  191. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -7
  192. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -11
  193. data/spec/dummy/db/schema.rb +0 -67
  194. data/spec/dummy/public/404.html +0 -26
  195. data/spec/dummy/public/422.html +0 -26
  196. data/spec/dummy/public/500.html +0 -26
  197. data/spec/dummy/public/favicon.ico +0 -0
  198. data/spec/dummy/script/rails +0 -6
  199. data/spec/factories.rb +0 -28
  200. data/spec/generators/application_owner_generator_spec.rb +0 -22
  201. data/spec/generators/install_generator_spec.rb +0 -31
  202. data/spec/generators/migration_generator_spec.rb +0 -20
  203. data/spec/generators/templates/routes.rb +0 -3
  204. data/spec/generators/views_generator_spec.rb +0 -27
  205. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  206. data/spec/lib/config_spec.rb +0 -334
  207. data/spec/lib/doorkeeper_spec.rb +0 -28
  208. data/spec/lib/models/expirable_spec.rb +0 -51
  209. data/spec/lib/models/revocable_spec.rb +0 -59
  210. data/spec/lib/models/scopes_spec.rb +0 -43
  211. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -42
  212. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
  213. data/spec/lib/oauth/client/credentials_spec.rb +0 -47
  214. data/spec/lib/oauth/client/methods_spec.rb +0 -54
  215. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  216. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  217. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  218. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  219. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
  220. data/spec/lib/oauth/client_spec.rb +0 -39
  221. data/spec/lib/oauth/code_request_spec.rb +0 -45
  222. data/spec/lib/oauth/code_response_spec.rb +0 -34
  223. data/spec/lib/oauth/error_response_spec.rb +0 -61
  224. data/spec/lib/oauth/error_spec.rb +0 -23
  225. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
  226. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
  227. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
  228. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -104
  229. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -28
  230. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -90
  231. data/spec/lib/oauth/pre_authorization_spec.rb +0 -155
  232. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -154
  233. data/spec/lib/oauth/scopes_spec.rb +0 -122
  234. data/spec/lib/oauth/token_request_spec.rb +0 -98
  235. data/spec/lib/oauth/token_response_spec.rb +0 -85
  236. data/spec/lib/oauth/token_spec.rb +0 -116
  237. data/spec/lib/request/strategy_spec.rb +0 -53
  238. data/spec/lib/server_spec.rb +0 -52
  239. data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
  240. data/spec/models/doorkeeper/access_token_spec.rb +0 -394
  241. data/spec/models/doorkeeper/application_spec.rb +0 -179
  242. data/spec/requests/applications/applications_request_spec.rb +0 -94
  243. data/spec/requests/applications/authorized_applications_spec.rb +0 -30
  244. data/spec/requests/endpoints/authorization_spec.rb +0 -72
  245. data/spec/requests/endpoints/token_spec.rb +0 -64
  246. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -66
  247. data/spec/requests/flows/authorization_code_spec.rb +0 -156
  248. data/spec/requests/flows/client_credentials_spec.rb +0 -58
  249. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
  250. data/spec/requests/flows/implicit_grant_spec.rb +0 -61
  251. data/spec/requests/flows/password_spec.rb +0 -115
  252. data/spec/requests/flows/refresh_token_spec.rb +0 -174
  253. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  254. data/spec/requests/flows/skip_authorization_spec.rb +0 -59
  255. data/spec/requests/protected_resources/metal_spec.rb +0 -14
  256. data/spec/requests/protected_resources/private_api_spec.rb +0 -81
  257. data/spec/routing/custom_controller_routes_spec.rb +0 -71
  258. data/spec/routing/default_routes_spec.rb +0 -35
  259. data/spec/routing/scoped_routes_spec.rb +0 -31
  260. data/spec/spec_helper.rb +0 -2
  261. data/spec/spec_helper_integration.rb +0 -59
  262. data/spec/support/dependencies/factory_girl.rb +0 -2
  263. data/spec/support/helpers/access_token_request_helper.rb +0 -11
  264. data/spec/support/helpers/authorization_request_helper.rb +0 -41
  265. data/spec/support/helpers/config_helper.rb +0 -9
  266. data/spec/support/helpers/model_helper.rb +0 -67
  267. data/spec/support/helpers/request_spec_helper.rb +0 -76
  268. data/spec/support/helpers/url_helper.rb +0 -55
  269. data/spec/support/http_method_shim.rb +0 -24
  270. data/spec/support/orm/active_record.rb +0 -3
  271. data/spec/support/shared/controllers_shared_context.rb +0 -69
  272. data/spec/support/shared/models_shared_examples.rb +0 -52
  273. 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