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,27 +0,0 @@
1
- require 'spec_helper_integration'
2
- require 'generators/doorkeeper/views_generator'
3
-
4
- describe Doorkeeper::Generators::ViewsGenerator do
5
- include GeneratorSpec::TestCase
6
-
7
- tests Doorkeeper::Generators::ViewsGenerator
8
- destination File.expand_path('../tmp/dummy', __FILE__)
9
-
10
- before :each do
11
- prepare_destination
12
- end
13
-
14
- it 'create all views' do
15
- run_generator
16
- assert_file 'app/views/doorkeeper/applications/_form.html.erb'
17
- assert_file 'app/views/doorkeeper/applications/edit.html.erb'
18
- assert_file 'app/views/doorkeeper/applications/index.html.erb'
19
- assert_file 'app/views/doorkeeper/applications/new.html.erb'
20
- assert_file 'app/views/doorkeeper/applications/show.html.erb'
21
-
22
- assert_file 'app/views/doorkeeper/authorizations/error.html.erb'
23
- assert_file 'app/views/doorkeeper/authorizations/new.html.erb'
24
-
25
- assert_file 'app/views/doorkeeper/authorized_applications/index.html.erb'
26
- end
27
- end
@@ -1,24 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe Doorkeeper::DashboardHelper do
4
- describe '.doorkeeper_errors_for' do
5
- let(:object) { double errors: { method: messages } }
6
- let(:messages) { ['first message', 'second message'] }
7
-
8
- context 'when object has errors' do
9
- it 'returns error messages' do
10
- messages.each do |message|
11
- expect(helper.doorkeeper_errors_for(object, :method)).to include(
12
- message.capitalize
13
- )
14
- end
15
- end
16
- end
17
-
18
- context 'when object has no errors' do
19
- it 'returns nil' do
20
- expect(helper.doorkeeper_errors_for(object, :amonter_method)).to be_nil
21
- end
22
- end
23
- end
24
- end
@@ -1,317 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe Doorkeeper, 'configuration' do
4
- subject { Doorkeeper.configuration }
5
-
6
- describe 'resource_owner_authenticator' do
7
- it 'sets the block that is accessible via authenticate_resource_owner' do
8
- block = proc {}
9
- Doorkeeper.configure do
10
- orm DOORKEEPER_ORM
11
- resource_owner_authenticator &block
12
- end
13
- expect(subject.authenticate_resource_owner).to eq(block)
14
- end
15
- end
16
-
17
- describe 'setup_orm_adapter' do
18
- it 'adds specific error message to NameError exception' do
19
- expect do
20
- Doorkeeper.configure { orm 'hibernate' }
21
- end.to raise_error(NameError, /ORM adapter not found \(hibernate\)/)
22
- end
23
-
24
- it 'does not change other exceptions' do
25
- allow_any_instance_of(String).to receive(:classify) { raise NoMethodError }
26
-
27
- expect do
28
- Doorkeeper.configure { orm 'hibernate' }
29
- end.to raise_error(NoMethodError, /ORM adapter not found \(hibernate\)/)
30
- end
31
- end
32
-
33
- describe 'admin_authenticator' do
34
- it 'sets the block that is accessible via authenticate_admin' do
35
- block = proc {}
36
- Doorkeeper.configure do
37
- orm DOORKEEPER_ORM
38
- admin_authenticator(&block)
39
- end
40
- expect(subject.authenticate_admin).to eq(block)
41
- end
42
- end
43
-
44
- describe 'access_token_expires_in' do
45
- it 'has 2 hours by default' do
46
- expect(subject.access_token_expires_in).to eq(2.hours)
47
- end
48
-
49
- it 'can change the value' do
50
- Doorkeeper.configure do
51
- orm DOORKEEPER_ORM
52
- access_token_expires_in 4.hours
53
- end
54
- expect(subject.access_token_expires_in).to eq(4.hours)
55
- end
56
-
57
- it 'can be set to nil' do
58
- Doorkeeper.configure do
59
- orm DOORKEEPER_ORM
60
- access_token_expires_in nil
61
- end
62
- expect(subject.access_token_expires_in).to be_nil
63
- end
64
- end
65
-
66
- describe 'scopes' do
67
- it 'has default scopes' do
68
- Doorkeeper.configure do
69
- orm DOORKEEPER_ORM
70
- default_scopes :public
71
- end
72
- expect(subject.default_scopes).to include('public')
73
- end
74
-
75
- it 'has optional scopes' do
76
- Doorkeeper.configure do
77
- orm DOORKEEPER_ORM
78
- optional_scopes :write, :update
79
- end
80
- expect(subject.optional_scopes).to include('write', 'update')
81
- end
82
-
83
- it 'has all scopes' do
84
- Doorkeeper.configure do
85
- orm DOORKEEPER_ORM
86
- default_scopes :normal
87
- optional_scopes :admin
88
- end
89
- expect(subject.scopes).to include('normal', 'admin')
90
- end
91
- end
92
-
93
- describe 'use_refresh_token' do
94
- it 'is false by default' do
95
- expect(subject.refresh_token_enabled?).to be_falsey
96
- end
97
-
98
- it 'can change the value' do
99
- Doorkeeper.configure do
100
- orm DOORKEEPER_ORM
101
- use_refresh_token
102
- end
103
- expect(subject.refresh_token_enabled?).to be_truthy
104
- end
105
-
106
- it "does not includes 'refresh_token' in authorization_response_types" do
107
- expect(subject.token_grant_types).not_to include 'refresh_token'
108
- end
109
-
110
- context "is enabled" do
111
- before do
112
- Doorkeeper.configure {
113
- orm DOORKEEPER_ORM
114
- use_refresh_token
115
- }
116
- end
117
-
118
- it "includes 'refresh_token' in authorization_response_types" do
119
- expect(subject.token_grant_types).to include 'refresh_token'
120
- end
121
- end
122
- end
123
-
124
- describe 'client_credentials' do
125
- it 'has defaults order' do
126
- expect(subject.client_credentials_methods).to eq([:from_basic, :from_params])
127
- end
128
-
129
- it 'can change the value' do
130
- Doorkeeper.configure do
131
- orm DOORKEEPER_ORM
132
- client_credentials :from_digest, :from_params
133
- end
134
- expect(subject.client_credentials_methods).to eq([:from_digest, :from_params])
135
- end
136
- end
137
-
138
- describe 'force_ssl_in_redirect_uri' do
139
- it 'is true by default in non-development environments' do
140
- expect(subject.force_ssl_in_redirect_uri).to be_truthy
141
- end
142
-
143
- it 'can change the value' do
144
- Doorkeeper.configure do
145
- orm DOORKEEPER_ORM
146
- force_ssl_in_redirect_uri(false)
147
- end
148
- expect(subject.force_ssl_in_redirect_uri).to be_falsey
149
- end
150
- end
151
-
152
- describe 'access_token_credentials' do
153
- it 'has defaults order' do
154
- expect(subject.access_token_methods).to eq([:from_bearer_authorization, :from_access_token_param, :from_bearer_param])
155
- end
156
-
157
- it 'can change the value' do
158
- Doorkeeper.configure do
159
- orm DOORKEEPER_ORM
160
- access_token_methods :from_access_token_param, :from_bearer_param
161
- end
162
- expect(subject.access_token_methods).to eq([:from_access_token_param, :from_bearer_param])
163
- end
164
- end
165
-
166
- describe 'enable_application_owner' do
167
- it 'is disabled by default' do
168
- expect(Doorkeeper.configuration.enable_application_owner?).not_to be_truthy
169
- end
170
-
171
- context 'when enabled without confirmation' do
172
- before do
173
- Doorkeeper.configure do
174
- orm DOORKEEPER_ORM
175
- enable_application_owner
176
- end
177
- end
178
- it 'adds support for application owner' do
179
- expect(Doorkeeper::Application.new).to respond_to :owner
180
- end
181
- it 'Doorkeeper.configuration.confirm_application_owner? returns false' do
182
- expect(Doorkeeper.configuration.confirm_application_owner?).not_to be_truthy
183
- end
184
- end
185
-
186
- context 'when enabled with confirmation set to true' do
187
- before do
188
- Doorkeeper.configure do
189
- orm DOORKEEPER_ORM
190
- enable_application_owner confirmation: true
191
- end
192
- end
193
- it 'adds support for application owner' do
194
- expect(Doorkeeper::Application.new).to respond_to :owner
195
- end
196
- it 'Doorkeeper.configuration.confirm_application_owner? returns true' do
197
- expect(Doorkeeper.configuration.confirm_application_owner?).to be_truthy
198
- end
199
- end
200
- end
201
-
202
- describe 'realm' do
203
- it 'is \'Doorkeeper\' by default' do
204
- expect(Doorkeeper.configuration.realm).to eq('Doorkeeper')
205
- end
206
-
207
- it 'can change the value' do
208
- Doorkeeper.configure do
209
- orm DOORKEEPER_ORM
210
- realm 'Example'
211
- end
212
- expect(subject.realm).to eq('Example')
213
- end
214
- end
215
-
216
- describe "grant_flows" do
217
- it "is set to all grant flows by default" do
218
- expect(Doorkeeper.configuration.grant_flows).
219
- to eq(%w(authorization_code client_credentials))
220
- end
221
-
222
- it "can change the value" do
223
- Doorkeeper.configure {
224
- orm DOORKEEPER_ORM
225
- grant_flows [ 'authorization_code', 'implicit' ]
226
- }
227
- expect(subject.grant_flows).to eq ['authorization_code', 'implicit']
228
- end
229
-
230
- context "when including 'authorization_code'" do
231
- before do
232
- Doorkeeper.configure {
233
- orm DOORKEEPER_ORM
234
- grant_flows ['authorization_code']
235
- }
236
- end
237
-
238
- it "includes 'code' in authorization_response_types" do
239
- expect(subject.authorization_response_types).to include 'code'
240
- end
241
-
242
- it "includes 'authorization_code' in token_grant_types" do
243
- expect(subject.token_grant_types).to include 'authorization_code'
244
- end
245
- end
246
-
247
- context "when including 'implicit'" do
248
- before do
249
- Doorkeeper.configure {
250
- orm DOORKEEPER_ORM
251
- grant_flows ['implicit']
252
- }
253
- end
254
-
255
- it "includes 'token' in authorization_response_types" do
256
- expect(subject.authorization_response_types).to include 'token'
257
- end
258
- end
259
-
260
- context "when including 'password'" do
261
- before do
262
- Doorkeeper.configure {
263
- orm DOORKEEPER_ORM
264
- grant_flows ['password']
265
- }
266
- end
267
-
268
- it "includes 'password' in token_grant_types" do
269
- expect(subject.token_grant_types).to include 'password'
270
- end
271
- end
272
-
273
- context "when including 'client_credentials'" do
274
- before do
275
- Doorkeeper.configure {
276
- orm DOORKEEPER_ORM
277
- grant_flows ['client_credentials']
278
- }
279
- end
280
-
281
- it "includes 'client_credentials' in token_grant_types" do
282
- expect(subject.token_grant_types).to include 'client_credentials'
283
- end
284
- end
285
- end
286
-
287
- it 'raises an exception when configuration is not set' do
288
- old_config = Doorkeeper.configuration
289
- Doorkeeper.module_eval do
290
- @config = nil
291
- end
292
-
293
- expect do
294
- Doorkeeper.configuration
295
- end.to raise_error Doorkeeper::MissingConfiguration
296
-
297
- Doorkeeper.module_eval do
298
- @config = old_config
299
- end
300
- end
301
-
302
- describe 'access_token_generator' do
303
- it 'is \'Doorkeeper::OAuth::Helpers::UniqueToken\' by default' do
304
- expect(Doorkeeper.configuration.access_token_generator).to(
305
- eq('Doorkeeper::OAuth::Helpers::UniqueToken')
306
- )
307
- end
308
-
309
- it 'can change the value' do
310
- Doorkeeper.configure do
311
- orm DOORKEEPER_ORM
312
- access_token_generator 'Example'
313
- end
314
- expect(subject.access_token_generator).to eq('Example')
315
- end
316
- end
317
- end
@@ -1,28 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe Doorkeeper do
4
- describe 'authenticate' do
5
- let(:token) { double('Token') }
6
- let(:request) { double('ActionDispatch::Request') }
7
- before do
8
- allow(Doorkeeper::OAuth::Token).to receive(:authenticate).
9
- with(request, *token_strategies) { token }
10
- end
11
-
12
- context 'with specific access token strategies' do
13
- let(:token_strategies) { [:first_way, :second_way] }
14
-
15
- it 'authenticates the token from the request' do
16
- expect(Doorkeeper.authenticate(request, token_strategies)).to eq(token)
17
- end
18
- end
19
-
20
- context 'with default access token strategies' do
21
- let(:token_strategies) { Doorkeeper.configuration.access_token_methods }
22
-
23
- it 'authenticates the token from the request' do
24
- expect(Doorkeeper.authenticate(request)).to eq(token)
25
- end
26
- end
27
- end
28
- end
@@ -1,51 +0,0 @@
1
- require 'spec_helper'
2
- require 'timecop'
3
- require 'active_support/time'
4
- require 'doorkeeper/models/concerns/expirable'
5
-
6
- describe 'Expirable' do
7
- subject do
8
- Class.new do
9
- include Doorkeeper::Models::Expirable
10
- end.new
11
- end
12
-
13
- before do
14
- allow(subject).to receive(:created_at).and_return(1.minute.ago)
15
- end
16
-
17
- describe :expired? do
18
- it 'is not expired if time has not passed' do
19
- allow(subject).to receive(:expires_in).and_return(2.minutes)
20
- expect(subject).not_to be_expired
21
- end
22
-
23
- it 'is expired if time has passed' do
24
- allow(subject).to receive(:expires_in).and_return(10.seconds)
25
- expect(subject).to be_expired
26
- end
27
-
28
- it 'is not expired if expires_in is not set' do
29
- allow(subject).to receive(:expires_in).and_return(nil)
30
- expect(subject).not_to be_expired
31
- end
32
- end
33
-
34
- describe :expires_in_seconds do
35
- it 'should return the amount of time remaining until the token is expired' do
36
- allow(subject).to receive(:expires_in).and_return(2.minutes)
37
- expect(subject.expires_in_seconds).to eq(60)
38
- end
39
-
40
- it 'should return 0 when expired' do
41
- allow(subject).to receive(:expires_in).and_return(30.seconds)
42
- expect(subject.expires_in_seconds).to eq(0)
43
- end
44
-
45
- it 'should return nil when expires_in is nil' do
46
- allow(subject).to receive(:expires_in).and_return(nil)
47
- expect(subject.expires_in_seconds).to be_nil
48
- end
49
-
50
- end
51
- end
@@ -1,36 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/object/blank'
3
- require 'doorkeeper/models/concerns/revocable'
4
-
5
- describe 'Revocable' do
6
- subject do
7
- Class.new do
8
- include Doorkeeper::Models::Revocable
9
- end.new
10
- end
11
-
12
- describe :revoke do
13
- it 'updates :revoked_at attribute with current time' do
14
- clock = double now: double
15
- expect(subject).to receive(:update_attribute).with(:revoked_at, clock.now)
16
- subject.revoke(clock)
17
- end
18
- end
19
-
20
- describe :revoked? do
21
- it 'is revoked if :revoked_at has passed' do
22
- allow(subject).to receive(:revoked_at).and_return(Time.now - 1000)
23
- expect(subject).to be_revoked
24
- end
25
-
26
- it 'is not revoked if :revoked_at has not passed' do
27
- allow(subject).to receive(:revoked_at).and_return(Time.now + 1000)
28
- expect(subject).not_to be_revoked
29
- end
30
-
31
- it 'is not revoked if :revoked_at is not set' do
32
- allow(subject).to receive(:revoked_at).and_return(nil)
33
- expect(subject).not_to be_revoked
34
- end
35
- end
36
- end
@@ -1,43 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/module/delegation'
3
- require 'active_support/core_ext/object/blank'
4
- require 'doorkeeper/oauth/scopes'
5
- require 'doorkeeper/models/concerns/scopes'
6
-
7
- describe 'Doorkeeper::Models::Scopes' do
8
- subject do
9
- Class.new(Hash) do
10
- include Doorkeeper::Models::Scopes
11
- end.new
12
- end
13
-
14
- before do
15
- subject[:scopes] = 'public admin'
16
- end
17
-
18
- describe :scopes do
19
- it 'is a `Scopes` class' do
20
- expect(subject.scopes).to be_a(Doorkeeper::OAuth::Scopes)
21
- end
22
-
23
- it 'includes scopes' do
24
- expect(subject.scopes).to include('public')
25
- end
26
- end
27
-
28
- describe :scopes_string do
29
- it 'is a `Scopes` class' do
30
- expect(subject.scopes_string).to eq('public admin')
31
- end
32
- end
33
-
34
- describe :includes_scope? do
35
- it 'should return true if at least one scope is included' do
36
- expect(subject.includes_scope?('public', 'private')).to be true
37
- end
38
-
39
- it 'should return false if no scopes are included' do
40
- expect(subject.includes_scope?('teacher', 'student')).to be false
41
- end
42
- end
43
- end
@@ -1,42 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/string'
3
- require 'uri'
4
- require 'rack/utils'
5
- require 'doorkeeper/oauth/authorization/uri_builder'
6
-
7
- module Doorkeeper::OAuth::Authorization
8
- describe URIBuilder do
9
-
10
- subject { Object.new.class.send :include, URIBuilder }
11
-
12
- describe :uri_with_query do
13
- it 'returns the uri with query' do
14
- uri = subject.uri_with_query 'http://example.com/', parameter: 'value'
15
- expect(uri).to eq('http://example.com/?parameter=value')
16
- end
17
-
18
- it 'rejects nil values' do
19
- uri = subject.uri_with_query 'http://example.com/', parameter: ''
20
- expect(uri).to eq('http://example.com/?')
21
- end
22
-
23
- it 'preserves original query parameters' do
24
- uri = subject.uri_with_query 'http://example.com/?query1=value', parameter: 'value'
25
- expect(uri).to match(/query1=value/)
26
- expect(uri).to match(/parameter=value/)
27
- end
28
- end
29
-
30
- describe :uri_with_fragment do
31
- it 'returns uri with parameters as fragments' do
32
- uri = subject.uri_with_fragment 'http://example.com/', parameter: 'value'
33
- expect(uri).to eq('http://example.com/#parameter=value')
34
- end
35
-
36
- it 'preserves original query parameters' do
37
- uri = subject.uri_with_fragment 'http://example.com/?query1=value1', parameter: 'value'
38
- expect(uri).to eq('http://example.com/?query1=value1#parameter=value')
39
- end
40
- end
41
- end
42
- end
@@ -1,80 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe AuthorizationCodeRequest do
5
- let(:server) do
6
- double :server,
7
- access_token_expires_in: 2.days,
8
- refresh_token_enabled?: false,
9
- custom_access_token_expires_in: ->(_app) { nil }
10
- end
11
- let(:grant) { FactoryGirl.create :access_grant }
12
- let(:client) { grant.application }
13
-
14
- subject do
15
- AuthorizationCodeRequest.new server, grant, client, redirect_uri: client.redirect_uri
16
- end
17
-
18
- it 'issues a new token for the client' do
19
- expect do
20
- subject.authorize
21
- end.to change { client.access_tokens.count }.by(1)
22
- end
23
-
24
- it "issues the token with same grant's scopes" do
25
- subject.authorize
26
- expect(Doorkeeper::AccessToken.last.scopes).to eq(grant.scopes)
27
- end
28
-
29
- it 'revokes the grant' do
30
- expect do
31
- subject.authorize
32
- end.to change { grant.reload.accessible? }
33
- end
34
-
35
- it 'requires the grant to be accessible' do
36
- grant.revoke
37
- subject.validate
38
- expect(subject.error).to eq(:invalid_grant)
39
- end
40
-
41
- it 'requires the grant' do
42
- subject.grant = nil
43
- subject.validate
44
- expect(subject.error).to eq(:invalid_grant)
45
- end
46
-
47
- it 'requires the client' do
48
- subject.client = nil
49
- subject.validate
50
- expect(subject.error).to eq(:invalid_client)
51
- end
52
-
53
- it 'requires the redirect_uri' do
54
- subject.redirect_uri = nil
55
- subject.validate
56
- expect(subject.error).to eq(:invalid_request)
57
- end
58
-
59
- it "matches the redirect_uri with grant's one" do
60
- subject.redirect_uri = 'http://other.com'
61
- subject.validate
62
- expect(subject.error).to eq(:invalid_grant)
63
- end
64
-
65
- it "matches the client with grant's one" do
66
- subject.client = FactoryGirl.create :application
67
- subject.validate
68
- expect(subject.error).to eq(:invalid_grant)
69
- end
70
-
71
- it 'skips token creation if there is a matching one' do
72
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
73
- FactoryGirl.create(:access_token, application_id: client.id,
74
- resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s)
75
- expect do
76
- subject.authorize
77
- end.to_not change { Doorkeeper::AccessToken.count }
78
- end
79
- end
80
- end
@@ -1,47 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/string'
3
- require 'doorkeeper/oauth/client'
4
-
5
- class Doorkeeper::OAuth::Client
6
- describe Credentials do
7
- it 'is blank when any of the credentials is blank' do
8
- expect(Credentials.new(nil, 'something')).to be_blank
9
- expect(Credentials.new('something', nil)).to be_blank
10
- end
11
-
12
- describe :from_request do
13
- let(:request) { double.as_null_object }
14
-
15
- let(:method) do
16
- ->(_request) { return 'uid', 'secret' }
17
- end
18
-
19
- it 'accepts anything that responds to #call' do
20
- expect(method).to receive(:call).with(request)
21
- Credentials.from_request request, method
22
- end
23
-
24
- it 'delegates methods received as symbols to Credentials class' do
25
- expect(Credentials).to receive(:from_params).with(request)
26
- Credentials.from_request request, :from_params
27
- end
28
-
29
- it 'stops at the first credentials found' do
30
- not_called_method = double
31
- expect(not_called_method).not_to receive(:call)
32
- Credentials.from_request request, ->(_) {}, method, not_called_method
33
- end
34
-
35
- it 'returns new Credentials' do
36
- credentials = Credentials.from_request request, method
37
- expect(credentials).to be_a(Credentials)
38
- end
39
-
40
- it 'returns uid and secret from extractor method' do
41
- credentials = Credentials.from_request request, method
42
- expect(credentials.uid).to eq('uid')
43
- expect(credentials.secret).to eq('secret')
44
- end
45
- end
46
- end
47
- end