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,104 +0,0 @@
1
- require 'spec_helper'
2
- require 'uri'
3
- require 'doorkeeper/oauth/helpers/uri_checker'
4
-
5
- module Doorkeeper::OAuth::Helpers
6
- describe URIChecker do
7
- describe '.valid?' do
8
- it 'is valid for valid uris' do
9
- uri = 'http://app.co'
10
- expect(URIChecker.valid?(uri)).to be_truthy
11
- end
12
-
13
- it 'is valid if include path param' do
14
- uri = 'http://app.co/path'
15
- expect(URIChecker.valid?(uri)).to be_truthy
16
- end
17
-
18
- it 'is valid if include query param' do
19
- uri = 'http://app.co/?query=1'
20
- expect(URIChecker.valid?(uri)).to be_truthy
21
- end
22
-
23
- it 'is invalid if uri includes fragment' do
24
- uri = 'http://app.co/test#fragment'
25
- expect(URIChecker.valid?(uri)).to be_falsey
26
- end
27
-
28
- it 'is invalid if scheme is missing' do
29
- uri = 'app.co'
30
- expect(URIChecker.valid?(uri)).to be_falsey
31
- end
32
-
33
- it 'is invalid if is a relative uri' do
34
- uri = '/abc/123'
35
- expect(URIChecker.valid?(uri)).to be_falsey
36
- end
37
-
38
- it 'is invalid if is not a url' do
39
- uri = 'http://'
40
- expect(URIChecker.valid?(uri)).to be_falsey
41
- end
42
- end
43
-
44
- describe '.matches?' do
45
- it 'is true if both url matches' do
46
- uri = client_uri = 'http://app.co/aaa'
47
- expect(URIChecker.matches?(uri, client_uri)).to be_truthy
48
- end
49
-
50
- it 'ignores query parameter on comparsion' do
51
- uri = 'http://app.co/?query=hello'
52
- client_uri = 'http://app.co'
53
- expect(URIChecker.matches?(uri, client_uri)).to be_truthy
54
- end
55
-
56
- it 'doesn\'t allow non-matching domains through' do
57
- uri = 'http://app.abc/?query=hello'
58
- client_uri = 'http://app.co'
59
- expect(URIChecker.matches?(uri, client_uri)).to be_falsey
60
- end
61
-
62
- it 'doesn\'t allow non-matching domains that don\'t start at the beginning' do
63
- uri = 'http://app.co/?query=hello'
64
- client_uri = 'http://example.com?app.co=test'
65
- expect(URIChecker.matches?(uri, client_uri)).to be_falsey
66
- end
67
- end
68
-
69
- describe '.valid_for_authorization?' do
70
- it 'is true if valid and matches' do
71
- uri = client_uri = 'http://app.co/aaa'
72
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_truthy
73
- end
74
-
75
- it 'is false if valid and mismatches' do
76
- uri = 'http://app.co/aaa'
77
- client_uri = 'http://app.co/bbb'
78
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_falsey
79
- end
80
-
81
- it 'is true if valid and included in array' do
82
- uri = 'http://app.co/aaa'
83
- client_uri = "http://example.com/bbb\nhttp://app.co/aaa"
84
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_truthy
85
- end
86
-
87
- it 'is false if valid and not included in array' do
88
- uri = 'http://app.co/aaa'
89
- client_uri = "http://example.com/bbb\nhttp://app.co/cc"
90
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be_falsey
91
- end
92
-
93
- it 'is true if valid and matches' do
94
- uri = client_uri = 'http://app.co/aaa'
95
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be true
96
- end
97
-
98
- it 'is false if invalid' do
99
- uri = client_uri = 'http://app.co/aaa?waffles=abc'
100
- expect(URIChecker.valid_for_authorization?(uri, client_uri)).to be false
101
- end
102
- end
103
- end
104
- end
@@ -1,28 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_model'
3
- require 'doorkeeper'
4
- require 'doorkeeper/oauth/invalid_token_response'
5
-
6
- module Doorkeeper::OAuth
7
- describe InvalidTokenResponse do
8
- describe '#name' do
9
- it { expect(subject.name).to eq(:invalid_token) }
10
- end
11
-
12
- describe '#status' do
13
- it { expect(subject.status).to eq(:unauthorized) }
14
- end
15
-
16
- describe :from_access_token do
17
- it 'revoked' do
18
- response = InvalidTokenResponse.from_access_token double(revoked?: true, expired?: true)
19
- expect(response.description).to include('revoked')
20
- end
21
-
22
- it 'expired' do
23
- response = InvalidTokenResponse.from_access_token double(revoked?: false, expired?: true)
24
- expect(response.description).to include('expired')
25
- end
26
- end
27
- end
28
- end
@@ -1,90 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe PasswordAccessTokenRequest do
5
- let(:server) do
6
- double(
7
- :server,
8
- default_scopes: Doorkeeper::OAuth::Scopes.new,
9
- access_token_expires_in: 2.hours,
10
- refresh_token_enabled?: false,
11
- custom_access_token_expires_in: ->(_app) { nil }
12
- )
13
- end
14
- let(:credentials) { Client::Credentials.new(client.uid, client.secret) }
15
- let(:client) { FactoryGirl.create(:application) }
16
- let(:owner) { double :owner, id: 99 }
17
-
18
- subject do
19
- PasswordAccessTokenRequest.new(server, credentials, owner)
20
- end
21
-
22
- it 'issues a new token for the client' do
23
- expect do
24
- subject.authorize
25
- end.to change { client.access_tokens.count }.by(1)
26
- end
27
-
28
- it 'issues a new token without a client' do
29
- expect do
30
- subject.credentials = nil
31
- subject.authorize
32
- end.to change { Doorkeeper::AccessToken.count }.by(1)
33
- end
34
-
35
- it 'does not issue a new token with an invalid client' do
36
- expect do
37
- subject.client = nil
38
- subject.authorize
39
- end.to_not change { Doorkeeper::AccessToken.count }
40
-
41
- expect(subject.error).to eq(:invalid_client)
42
- end
43
-
44
- it 'requires the owner' do
45
- subject.resource_owner = nil
46
- subject.validate
47
- expect(subject.error).to eq(:invalid_grant)
48
- end
49
-
50
- it 'optionally accepts the client' do
51
- subject.credentials = nil
52
- expect(subject).to be_valid
53
- end
54
-
55
- it 'creates token even when there is already one (default)' do
56
- FactoryGirl.create(:access_token, application_id: client.id, resource_owner_id: owner.id)
57
- expect do
58
- subject.authorize
59
- end.to change { Doorkeeper::AccessToken.count }.by(1)
60
- end
61
-
62
- it 'skips token creation if there is already one' do
63
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
64
- FactoryGirl.create(:access_token, application_id: client.id, resource_owner_id: owner.id)
65
- expect do
66
- subject.authorize
67
- end.to_not change { Doorkeeper::AccessToken.count }
68
- end
69
-
70
- describe 'with scopes' do
71
- subject do
72
- PasswordAccessTokenRequest.new(server, client, owner, scope: 'public')
73
- end
74
-
75
- it 'validates the current scope' do
76
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string('another'))
77
- subject.validate
78
- expect(subject.error).to eq(:invalid_scope)
79
- end
80
-
81
- it 'creates the token with scopes' do
82
- allow(server).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string('public'))
83
- expect do
84
- subject.authorize
85
- end.to change { Doorkeeper::AccessToken.count }.by(1)
86
- expect(Doorkeeper::AccessToken.last.scopes).to include('public')
87
- end
88
- end
89
- end
90
- end
@@ -1,155 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe PreAuthorization do
5
- let(:server) {
6
- server = Doorkeeper.configuration
7
- allow(server).to receive(:default_scopes).and_return(Scopes.new)
8
- allow(server).to receive(:scopes).and_return(Scopes.from_string('public profile'))
9
- server
10
- }
11
-
12
- let(:application) do
13
- application = double :application
14
- allow(application).to receive(:scopes).and_return(Scopes.from_string(''))
15
- application
16
- end
17
-
18
- let(:client) do
19
- double :client, redirect_uri: 'http://tst.com/auth', application: application
20
- end
21
-
22
- let :attributes do
23
- {
24
- response_type: 'code',
25
- redirect_uri: 'http://tst.com/auth',
26
- state: 'save-this'
27
- }
28
- end
29
-
30
- subject do
31
- PreAuthorization.new(server, client, attributes)
32
- end
33
-
34
- it 'is authorizable when request is valid' do
35
- expect(subject).to be_authorizable
36
- end
37
-
38
- it 'accepts code as response type' do
39
- subject.response_type = 'code'
40
- expect(subject).to be_authorizable
41
- end
42
-
43
- it 'accepts token as response type' do
44
- allow(server).to receive(:grant_flows).and_return(['implicit'])
45
- subject.response_type = 'token'
46
- expect(subject).to be_authorizable
47
- end
48
-
49
- context 'when using default grant flows' do
50
- it 'accepts "code" as response type' do
51
- subject.response_type = 'code'
52
- expect(subject).to be_authorizable
53
- end
54
-
55
- it 'accepts "token" as response type' do
56
- allow(server).to receive(:grant_flows).and_return(['implicit'])
57
- subject.response_type = 'token'
58
- expect(subject).to be_authorizable
59
- end
60
- end
61
-
62
- context 'when authorization code grant flow is disabled' do
63
- before do
64
- allow(server).to receive(:grant_flows).and_return(['implicit'])
65
- end
66
-
67
- it 'does not accept "code" as response type' do
68
- subject.response_type = 'code'
69
- expect(subject).not_to be_authorizable
70
- end
71
- end
72
-
73
- context 'when implicit grant flow is disabled' do
74
- before do
75
- allow(server).to receive(:grant_flows).and_return(['authorization_code'])
76
- end
77
-
78
- it 'does not accept "token" as response type' do
79
- subject.response_type = 'token'
80
- expect(subject).not_to be_authorizable
81
- end
82
- end
83
-
84
- context 'client application does not restrict valid scopes' do
85
- it 'accepts valid scopes' do
86
- subject.scope = 'public'
87
- expect(subject).to be_authorizable
88
- end
89
-
90
- it 'rejects (globally) non-valid scopes' do
91
- subject.scope = 'invalid'
92
- expect(subject).not_to be_authorizable
93
- end
94
- end
95
-
96
- context 'client application restricts valid scopes' do
97
- let(:application) do
98
- application = double :application
99
- allow(application).to receive(:scopes).and_return(Scopes.from_string('public nonsense'))
100
- application
101
- end
102
-
103
- it 'accepts valid scopes' do
104
- subject.scope = 'public'
105
- expect(subject).to be_authorizable
106
- end
107
-
108
- it 'rejects (globally) non-valid scopes' do
109
- subject.scope = 'invalid'
110
- expect(subject).not_to be_authorizable
111
- end
112
-
113
- it 'rejects (application level) non-valid scopes' do
114
- subject.scope = 'profile'
115
- expect(subject).to_not be_authorizable
116
- end
117
- end
118
-
119
- it 'uses default scopes when none is required' do
120
- allow(server).to receive(:default_scopes).and_return(Scopes.from_string('default'))
121
- subject.scope = nil
122
- expect(subject.scope).to eq('default')
123
- expect(subject.scopes).to eq(Scopes.from_string('default'))
124
- end
125
-
126
- it 'accepts test uri' do
127
- subject.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
128
- expect(subject).to be_authorizable
129
- end
130
-
131
- it 'matches the redirect uri against client\'s one' do
132
- subject.redirect_uri = 'http://nothesame.com'
133
- expect(subject).not_to be_authorizable
134
- end
135
-
136
- it 'stores the state' do
137
- expect(subject.state).to eq('save-this')
138
- end
139
-
140
- it 'rejects if response type is not allowed' do
141
- subject.response_type = 'whops'
142
- expect(subject).not_to be_authorizable
143
- end
144
-
145
- it 'requires an existing client' do
146
- subject.client = nil
147
- expect(subject).not_to be_authorizable
148
- end
149
-
150
- it 'requires a redirect uri' do
151
- subject.redirect_uri = nil
152
- expect(subject).not_to be_authorizable
153
- end
154
- end
155
- end
@@ -1,123 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module Doorkeeper::OAuth
4
- describe RefreshTokenRequest do
5
- let(:server) do
6
- double :server,
7
- access_token_expires_in: 2.minutes,
8
- custom_access_token_expires_in: -> (_oauth_client) { nil }
9
- end
10
- let(:refresh_token) do
11
- FactoryGirl.create(:access_token, use_refresh_token: true)
12
- end
13
- let(:client) { refresh_token.application }
14
- let(:credentials) { Client::Credentials.new(client.uid, client.secret) }
15
-
16
- subject { RefreshTokenRequest.new server, refresh_token, credentials }
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
- expect(client.reload.access_tokens.last.expires_in).to eq(120)
23
- end
24
-
25
- it 'issues a new token for the client with custom expires_in' do
26
- server = double :server,
27
- access_token_expires_in: 2.minutes,
28
- custom_access_token_expires_in: ->(_oauth_client) { 1234 }
29
-
30
- RefreshTokenRequest.new(server, refresh_token, credentials).authorize
31
-
32
- expect(client.reload.access_tokens.last.expires_in).to eq(1234)
33
- end
34
-
35
- it 'revokes the previous token' do
36
- expect { subject.authorize }.to change { refresh_token.revoked? }.from(false).to(true)
37
- end
38
-
39
- it 'requires the refresh token' do
40
- subject.refresh_token = nil
41
- subject.validate
42
- expect(subject.error).to eq(:invalid_request)
43
- end
44
-
45
- it 'requires credentials to be valid if provided' do
46
- subject.client = nil
47
- subject.validate
48
- expect(subject.error).to eq(:invalid_client)
49
- end
50
-
51
- it "requires the token's client and current client to match" do
52
- subject.client = FactoryGirl.create(:application)
53
- subject.validate
54
- expect(subject.error).to eq(:invalid_grant)
55
- end
56
-
57
- it 'rejects revoked tokens' do
58
- refresh_token.revoke
59
- subject.validate
60
- expect(subject.error).to eq(:invalid_grant)
61
- end
62
-
63
- it 'accepts expired tokens' do
64
- refresh_token.expires_in = -1
65
- refresh_token.save
66
- subject.validate
67
- expect(subject).to be_valid
68
- end
69
-
70
- context 'clientless access tokens' do
71
- let!(:refresh_token) { FactoryGirl.create(:clientless_access_token, use_refresh_token: true) }
72
-
73
- subject { RefreshTokenRequest.new server, refresh_token, nil }
74
-
75
- it 'issues a new token without a client' do
76
- expect { subject.authorize }.to change { Doorkeeper::AccessToken.count }.by(1)
77
- end
78
- end
79
-
80
- context 'with scopes' do
81
- let(:refresh_token) do
82
- FactoryGirl.create :access_token,
83
- use_refresh_token: true,
84
- scopes: 'public write'
85
- end
86
- let(:parameters) { {} }
87
- subject { RefreshTokenRequest.new server, refresh_token, credentials, parameters }
88
-
89
- it 'transfers scopes from the old token to the new token' do
90
- subject.authorize
91
- expect(Doorkeeper::AccessToken.last.scopes).to eq([:public, :write])
92
- end
93
-
94
- it 'reduces scopes to the provided scopes' do
95
- parameters[:scopes] = 'public'
96
- subject.authorize
97
- expect(Doorkeeper::AccessToken.last.scopes).to eq([:public])
98
- end
99
-
100
- it 'validates that scopes are included in the original access token' do
101
- parameters[:scopes] = 'public update'
102
-
103
- subject.validate
104
- expect(subject.error).to eq(:invalid_scope)
105
- end
106
-
107
- it 'uses params[:scope] in favor of scopes if present (valid)' do
108
- parameters[:scopes] = 'public update'
109
- parameters[:scope] = 'public'
110
- subject.authorize
111
- expect(Doorkeeper::AccessToken.last.scopes).to eq([:public])
112
- end
113
-
114
- it 'uses params[:scope] in favor of scopes if present (invalid)' do
115
- parameters[:scopes] = 'public'
116
- parameters[:scope] = 'public update'
117
-
118
- subject.validate
119
- expect(subject.error).to eq(:invalid_scope)
120
- end
121
- end
122
- end
123
- end
@@ -1,123 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/module/delegation'
3
- require 'active_support/core_ext/string'
4
- require 'doorkeeper/oauth/scopes'
5
-
6
- module Doorkeeper::OAuth
7
- describe Scopes do
8
- describe '#add' do
9
- it 'allows you to add scopes with symbols' do
10
- subject.add :public
11
- expect(subject.all).to eq(['public'])
12
- end
13
-
14
- it 'allows you to add scopes with strings' do
15
- subject.add 'public'
16
- expect(subject.all).to eq(['public'])
17
- end
18
-
19
- it 'do not add already included scopes' do
20
- subject.add :public
21
- subject.add :public
22
- expect(subject.all).to eq(['public'])
23
- end
24
- end
25
-
26
- describe '#exists' do
27
- before do
28
- subject.add :public
29
- end
30
-
31
- it 'returns true if scope with given name is present' do
32
- expect(subject.exists?('public')).to be_truthy
33
- end
34
-
35
- it 'returns false if scope with given name does not exist' do
36
- expect(subject.exists?('other')).to be_falsey
37
- end
38
-
39
- it 'handles symbols' do
40
- expect(subject.exists?(:public)).to be_truthy
41
- expect(subject.exists?(:other)).to be_falsey
42
- end
43
- end
44
-
45
- describe '.from_string' do
46
- let(:string) { 'public write' }
47
-
48
- subject { Scopes.from_string(string) }
49
-
50
- it { expect(subject).to be_a(Scopes) }
51
-
52
- describe '#all' do
53
- it 'should be an array of the expected scopes' do
54
- scopes_array = subject.all
55
- expect(scopes_array.size).to eq(2)
56
- expect(scopes_array).to include('public')
57
- expect(scopes_array).to include('write')
58
- end
59
- end
60
- end
61
-
62
- describe '#+' do
63
- it 'can add to another scope object' do
64
- scopes = Scopes.from_string('public') + Scopes.from_string('admin')
65
- expect(scopes.all).to eq(%w(public admin))
66
- end
67
-
68
- it 'does not change the existing object' do
69
- origin = Scopes.from_string('public')
70
- new_scope = origin + Scopes.from_string('admin')
71
- expect(origin.to_s).to eq('public')
72
- end
73
-
74
- it 'raises an error if cannot handle addition' do
75
- expect do
76
- Scopes.from_string('public') + 'admin'
77
- end.to raise_error(NoMethodError)
78
- end
79
- end
80
-
81
- describe '#==' do
82
- it 'is equal to another set of scopes' do
83
- expect(Scopes.from_string('public')).to eq(Scopes.from_string('public'))
84
- end
85
-
86
- it 'is equal to another set of scopes with no particular order' do
87
- expect(Scopes.from_string('public write')).to eq(Scopes.from_string('write public'))
88
- end
89
-
90
- it 'differs from another set of scopes when scopes are not the same' do
91
- expect(Scopes.from_string('public write')).not_to eq(Scopes.from_string('write'))
92
- end
93
- end
94
-
95
- describe '#has_scopes?' do
96
- subject { Scopes.from_string('public admin') }
97
-
98
- it 'returns true when at least one scope is included' do
99
- expect(subject.has_scopes?(Scopes.from_string('public'))).to be_truthy
100
- end
101
-
102
- it 'returns true when all scopes are included' do
103
- expect(subject.has_scopes?(Scopes.from_string('public admin'))).to be_truthy
104
- end
105
-
106
- it 'is true if all scopes are included in any order' do
107
- expect(subject.has_scopes?(Scopes.from_string('admin public'))).to be_truthy
108
- end
109
-
110
- it 'is false if no scopes are included' do
111
- expect(subject.has_scopes?(Scopes.from_string('notexistent'))).to be_falsey
112
- end
113
-
114
- it 'returns false when any scope is not included' do
115
- expect(subject.has_scopes?(Scopes.from_string('public nope'))).to be_falsey
116
- end
117
-
118
- it 'is false if no scopes are included even for existing ones' do
119
- expect(subject.has_scopes?(Scopes.from_string('public admin notexistent'))).to be_falsey
120
- end
121
- end
122
- end
123
- end