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,45 +0,0 @@
1
- module ModelHelper
2
- def client_exists(client_attributes = {})
3
- @client = FactoryGirl.create(:application, client_attributes)
4
- end
5
-
6
- def create_resource_owner
7
- @resource_owner = User.create!(name: 'Joe', password: 'sekret')
8
- end
9
-
10
- def authorization_code_exists(options = {})
11
- @authorization = FactoryGirl.create(:access_grant, options)
12
- end
13
-
14
- def access_grant_should_exist_for(client, resource_owner)
15
- grant = Doorkeeper::AccessGrant.first
16
- expect(grant.application).to eq(client)
17
- grant.resource_owner_id == resource_owner.id
18
- end
19
-
20
- def access_token_should_exist_for(client, resource_owner)
21
- grant = Doorkeeper::AccessToken.first
22
- expect(grant.application).to eq(client)
23
- grant.resource_owner_id == resource_owner.id
24
- end
25
-
26
- def access_grant_should_not_exist
27
- expect(Doorkeeper::AccessGrant.all).to be_empty
28
- end
29
-
30
- def access_token_should_not_exist
31
- expect(Doorkeeper::AccessToken.all).to be_empty
32
- end
33
-
34
- def access_grant_should_have_scopes(*args)
35
- grant = Doorkeeper::AccessGrant.first
36
- expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
37
- end
38
-
39
- def access_token_should_have_scopes(*args)
40
- grant = Doorkeeper::AccessToken.last
41
- expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
42
- end
43
- end
44
-
45
- RSpec.configuration.send :include, ModelHelper
@@ -1,76 +0,0 @@
1
- module RequestSpecHelper
2
- def i_should_see(content)
3
- expect(page).to have_content(content)
4
- end
5
-
6
- def i_should_not_see(content)
7
- expect(page).to have_no_content(content)
8
- end
9
-
10
- def i_should_be_on(path)
11
- expect(current_path).to eq(path)
12
- end
13
-
14
- def url_should_have_param(param, value)
15
- expect(current_params[param]).to eq(value)
16
- end
17
-
18
- def url_should_not_have_param(param)
19
- expect(current_params).not_to have_key(param)
20
- end
21
-
22
- def current_params
23
- Rack::Utils.parse_query(current_uri.query)
24
- end
25
-
26
- def current_uri
27
- URI.parse(page.current_url)
28
- end
29
-
30
- def should_have_header(header, value)
31
- expect(headers[header]).to eq(value)
32
- end
33
-
34
- def with_access_token_header(token)
35
- with_header 'Authorization', "Bearer #{token}"
36
- end
37
-
38
- def with_header(header, value)
39
- page.driver.header header, value
40
- end
41
-
42
- def basic_auth_header_for_client(client)
43
- ActionController::HttpAuthentication::Basic.encode_credentials client.uid, client.secret
44
- end
45
-
46
- def should_have_json(key, value)
47
- expect(JSON.parse(response.body).fetch(key)).to eq(value)
48
- end
49
-
50
- def should_have_json_within(key, value, range)
51
- expect(JSON.parse(response.body).fetch(key)).to be_within(range).of(value)
52
- end
53
-
54
- def should_not_have_json(key)
55
- expect(JSON.parse(response.body)).not_to have_key(key)
56
- end
57
-
58
- def sign_in
59
- visit '/'
60
- click_on 'Sign in'
61
- end
62
-
63
- def i_should_see_translated_error_message(key)
64
- i_should_see translated_error_message(key)
65
- end
66
-
67
- def translated_error_message(key)
68
- I18n.translate key, scope: [:doorkeeper, :errors, :messages]
69
- end
70
-
71
- def response_status_should_be(status)
72
- expect(page.driver.response.status.to_i).to eq(status)
73
- end
74
- end
75
-
76
- RSpec.configuration.send :include, RequestSpecHelper
@@ -1,55 +0,0 @@
1
- module UrlHelper
2
- def token_endpoint_url(options = {})
3
- parameters = {
4
- code: options[:code],
5
- client_id: options[:client_id] || (options[:client] ? options[:client].uid : nil),
6
- client_secret: options[:client_secret] || (options[:client] ? options[:client].secret : nil),
7
- redirect_uri: options[:redirect_uri] || (options[:client] ? options[:client].redirect_uri : nil),
8
- grant_type: options[:grant_type] || 'authorization_code'
9
- }
10
- "/oauth/token?#{build_query(parameters)}"
11
- end
12
-
13
- def password_token_endpoint_url(options = {})
14
- parameters = {
15
- code: options[:code],
16
- client_id: options[:client_id] || (options[:client] ? options[:client].uid : nil),
17
- client_secret: options[:client_secret] || (options[:client] ? options[:client].secret : nil),
18
- username: options[:resource_owner_username] || (options[:resource_owner] ? options[:resource_owner].name : nil),
19
- password: options[:resource_owner_password] || (options[:resource_owner] ? options[:resource_owner].password : nil),
20
- grant_type: 'password'
21
- }
22
- "/oauth/token?#{build_query(parameters)}"
23
- end
24
-
25
- def authorization_endpoint_url(options = {})
26
- parameters = {
27
- client_id: options[:client_id] || options[:client].uid,
28
- redirect_uri: options[:redirect_uri] || options[:client].redirect_uri,
29
- response_type: options[:response_type] || 'code',
30
- scope: options[:scope],
31
- state: options[:state]
32
- }.reject { |k, v| v.blank? }
33
- "/oauth/authorize?#{build_query(parameters)}"
34
- end
35
-
36
- def refresh_token_endpoint_url(options = {})
37
- parameters = {
38
- refresh_token: options[:refresh_token],
39
- client_id: options[:client_id] || options[:client].uid,
40
- client_secret: options[:client_secret] || options[:client].secret,
41
- grant_type: options[:grant_type] || 'refresh_token'
42
- }
43
- "/oauth/token?#{build_query(parameters)}"
44
- end
45
-
46
- def revocation_token_endpoint_url
47
- '/oauth/revoke'
48
- end
49
-
50
- def build_query(hash)
51
- Rack::Utils.build_query(hash)
52
- end
53
- end
54
-
55
- RSpec.configuration.send :include, UrlHelper
@@ -1,3 +0,0 @@
1
- # load schema to in memory sqlite
2
- ActiveRecord::Migration.verbose = false
3
- load Rails.root + 'db/schema.rb'
@@ -1,60 +0,0 @@
1
- shared_context 'valid token', token: :valid do
2
- let :token_string do
3
- '1A2B3C4D'
4
- end
5
-
6
- let :token do
7
- double(Doorkeeper::AccessToken, accessible?: true, includes_scope?: true, acceptable?: true)
8
- end
9
-
10
- before :each do
11
- allow(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
12
- end
13
- end
14
-
15
- shared_context 'invalid token', token: :invalid do
16
- let :token_string do
17
- '1A2B3C4D'
18
- end
19
-
20
- let :token do
21
- double(Doorkeeper::AccessToken, accessible?: false, revoked?: false, expired?: false, includes_scope?: false, acceptable?: false)
22
- end
23
-
24
- before :each do
25
- allow(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
26
- end
27
- end
28
-
29
- shared_context 'authenticated resource owner' do
30
- before do
31
- user = double(:resource, id: 1)
32
- allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { user } }
33
- end
34
- end
35
-
36
- shared_context 'not authenticated resource owner' do
37
- before do
38
- allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { redirect_to '/' } }
39
- end
40
- end
41
-
42
- shared_context 'valid authorization request' do
43
- let :authorization do
44
- double(:authorization, valid?: true, authorize: true, success_redirect_uri: 'http://something.com/cb?code=token')
45
- end
46
-
47
- before do
48
- allow(controller).to receive(:authorization) { authorization }
49
- end
50
- end
51
-
52
- shared_context 'invalid authorization request' do
53
- let :authorization do
54
- double(:authorization, valid?: false, authorize: false, redirect_on_error?: false)
55
- end
56
-
57
- before do
58
- allow(controller).to receive(:authorization) { authorization }
59
- end
60
- end
@@ -1,52 +0,0 @@
1
- shared_examples 'an accessible token' do
2
- describe :accessible? do
3
- it 'is accessible if token is not expired' do
4
- allow(subject).to receive(:expired?).and_return(false)
5
- should be_accessible
6
- end
7
-
8
- it 'is not accessible if token is expired' do
9
- allow(subject).to receive(:expired?).and_return(true)
10
- should_not be_accessible
11
- end
12
- end
13
- end
14
-
15
- shared_examples 'a revocable token' do
16
- describe :accessible? do
17
- before { subject.save! }
18
-
19
- it 'is accessible if token is not revoked' do
20
- expect(subject).to be_accessible
21
- end
22
-
23
- it 'is not accessible if token is revoked' do
24
- subject.revoke
25
- expect(subject).not_to be_accessible
26
- end
27
- end
28
- end
29
-
30
- shared_examples 'a unique token' do
31
- describe :token do
32
- it 'is generated before validation' do
33
- expect { subject.valid? }.to change { subject.token }.from(nil)
34
- end
35
-
36
- it 'is not valid if token exists' do
37
- token1 = FactoryGirl.create factory_name
38
- token2 = FactoryGirl.create factory_name
39
- token2.token = token1.token
40
- expect(token2).not_to be_valid
41
- end
42
-
43
- it 'expects database to throw an error when tokens are the same' do
44
- token1 = FactoryGirl.create factory_name
45
- token2 = FactoryGirl.create factory_name
46
- token2.token = token1.token
47
- expect do
48
- token2.save!(validate: false)
49
- end.to raise_error(ActiveRecord::RecordNotUnique)
50
- end
51
- end
52
- end
@@ -1,78 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe RedirectUriValidator do
4
- subject do
5
- FactoryGirl.create(:application)
6
- end
7
-
8
- it 'is valid when the uri is a uri' do
9
- subject.redirect_uri = 'https://example.com/callback'
10
- expect(subject).to be_valid
11
- end
12
-
13
- it 'accepts native redirect uri' do
14
- subject.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
15
- expect(subject).to be_valid
16
- end
17
-
18
- it 'rejects if test uri is disabled' do
19
- allow(RedirectUriValidator).to receive(:native_redirect_uri).and_return(nil)
20
- subject.redirect_uri = 'urn:some:test'
21
- expect(subject).not_to be_valid
22
- end
23
-
24
- it 'is invalid when the uri is not a uri' do
25
- subject.redirect_uri = ']'
26
- expect(subject).not_to be_valid
27
- expect(subject.errors[:redirect_uri].first).to eq('must be a valid URI.')
28
- end
29
-
30
- it 'is invalid when the uri is relative' do
31
- subject.redirect_uri = '/abcd'
32
- expect(subject).not_to be_valid
33
- expect(subject.errors[:redirect_uri].first).to eq('must be an absolute URI.')
34
- end
35
-
36
- it 'is invalid when the uri has a fragment' do
37
- subject.redirect_uri = 'https://example.com/abcd#xyz'
38
- expect(subject).not_to be_valid
39
- expect(subject.errors[:redirect_uri].first).to eq('cannot contain a fragment.')
40
- end
41
-
42
- it 'is invalid when the uri has a query parameter' do
43
- subject.redirect_uri = 'https://example.com/abcd?xyz=123'
44
- expect(subject).to be_valid
45
- end
46
-
47
- context 'force secured uri' do
48
- it 'accepts an valid uri' do
49
- subject.redirect_uri = 'https://example.com/callback'
50
- expect(subject).to be_valid
51
- end
52
-
53
- it 'accepts native redirect uri' do
54
- subject.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
55
- expect(subject).to be_valid
56
- end
57
-
58
- it 'accepts app redirect uri' do
59
- subject.redirect_uri = 'some-awesome-app://oauth/callback'
60
- expect(subject).to be_valid
61
- end
62
-
63
- it 'accepts a non secured protocol when disabled' do
64
- subject.redirect_uri = 'http://example.com/callback'
65
- allow(Doorkeeper.configuration).to receive(
66
- :force_ssl_in_redirect_uri
67
- ).and_return(false)
68
- expect(subject).to be_valid
69
- end
70
-
71
- it 'invalidates the uri when the uri does not use a secure protocol' do
72
- subject.redirect_uri = 'http://example.com/callback'
73
- expect(subject).not_to be_valid
74
- error = subject.errors[:redirect_uri].first
75
- expect(error).to eq('must be an HTTPS/SSL URI.')
76
- end
77
- end
78
- end