doorkeeper 4.2.0 → 5.5.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 (271) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1038 -0
  3. data/README.md +110 -348
  4. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +6 -7
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +7 -11
  7. data/app/controllers/doorkeeper/applications_controller.rb +65 -20
  8. data/app/controllers/doorkeeper/authorizations_controller.rb +97 -17
  9. data/app/controllers/doorkeeper/authorized_applications_controller.rb +22 -3
  10. data/app/controllers/doorkeeper/token_info_controller.rb +16 -4
  11. data/app/controllers/doorkeeper/tokens_controller.rb +112 -35
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +10 -6
  13. data/app/views/doorkeeper/applications/_delete_form.html.erb +4 -3
  14. data/app/views/doorkeeper/applications/_form.html.erb +33 -21
  15. data/app/views/doorkeeper/applications/edit.html.erb +1 -1
  16. data/app/views/doorkeeper/applications/index.html.erb +18 -6
  17. data/app/views/doorkeeper/applications/new.html.erb +1 -1
  18. data/app/views/doorkeeper/applications/show.html.erb +40 -16
  19. data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
  20. data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
  21. data/app/views/doorkeeper/authorizations/new.html.erb +7 -1
  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 +33 -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 +545 -143
  30. data/lib/doorkeeper/engine.rb +11 -5
  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 +100 -21
  40. data/lib/doorkeeper/models/access_token_mixin.rb +379 -75
  41. data/lib/doorkeeper/models/application_mixin.rb +72 -25
  42. data/lib/doorkeeper/models/concerns/accessible.rb +6 -0
  43. data/lib/doorkeeper/models/concerns/expirable.rb +20 -6
  44. data/lib/doorkeeper/models/concerns/orderable.rb +15 -0
  45. data/lib/doorkeeper/models/concerns/ownership.rb +4 -7
  46. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  47. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  48. data/lib/doorkeeper/models/concerns/revocable.rb +12 -18
  49. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  50. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  51. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  52. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  53. data/lib/doorkeeper/oauth/authorization/token.rb +66 -28
  54. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
  55. data/lib/doorkeeper/oauth/authorization_code_request.rb +64 -14
  56. data/lib/doorkeeper/oauth/base_request.rb +66 -0
  57. data/lib/doorkeeper/oauth/base_response.rb +31 -0
  58. data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
  59. data/lib/doorkeeper/oauth/client.rb +10 -12
  60. data/lib/doorkeeper/oauth/client_credentials/creator.rb +47 -4
  61. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +16 -9
  62. data/lib/doorkeeper/oauth/client_credentials/validator.rb +56 -0
  63. data/lib/doorkeeper/oauth/client_credentials_request.rb +11 -15
  64. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  65. data/lib/doorkeeper/oauth/code_response.rb +28 -15
  66. data/lib/doorkeeper/oauth/error.rb +5 -3
  67. data/lib/doorkeeper/oauth/error_response.rb +41 -20
  68. data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
  69. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -18
  70. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  71. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +53 -3
  72. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  73. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  74. data/lib/doorkeeper/oauth/invalid_token_response.rb +31 -5
  75. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  76. data/lib/doorkeeper/oauth/password_access_token_request.rb +45 -13
  77. data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
  78. data/lib/doorkeeper/oauth/refresh_token_request.rb +61 -36
  79. data/lib/doorkeeper/oauth/scopes.rb +26 -12
  80. data/lib/doorkeeper/oauth/token.rb +25 -23
  81. data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
  82. data/lib/doorkeeper/oauth/token_request.rb +8 -21
  83. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  84. data/lib/doorkeeper/oauth.rb +13 -0
  85. data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
  86. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -25
  87. data/lib/doorkeeper/orm/active_record/application.rb +6 -15
  88. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
  89. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
  90. data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
  91. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  92. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  93. data/lib/doorkeeper/orm/active_record.rb +37 -8
  94. data/lib/doorkeeper/rails/helpers.rb +14 -15
  95. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  96. data/lib/doorkeeper/rails/routes/mapper.rb +3 -1
  97. data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
  98. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  99. data/lib/doorkeeper/rails/routes.rb +42 -30
  100. data/lib/doorkeeper/rake/db.rake +40 -0
  101. data/lib/doorkeeper/rake/setup.rake +11 -0
  102. data/lib/doorkeeper/rake.rb +14 -0
  103. data/lib/doorkeeper/request/authorization_code.rb +12 -4
  104. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  105. data/lib/doorkeeper/request/code.rb +1 -1
  106. data/lib/doorkeeper/request/password.rb +5 -14
  107. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  108. data/lib/doorkeeper/request/strategy.rb +4 -2
  109. data/lib/doorkeeper/request/token.rb +1 -1
  110. data/lib/doorkeeper/request.rb +62 -29
  111. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  112. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  113. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  114. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  115. data/lib/doorkeeper/server.rb +9 -19
  116. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  117. data/lib/doorkeeper/validations.rb +5 -2
  118. data/lib/doorkeeper/version.rb +12 -1
  119. data/lib/doorkeeper.rb +111 -56
  120. data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
  121. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  122. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  123. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  124. data/lib/generators/doorkeeper/migration_generator.rb +27 -10
  125. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  126. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +31 -19
  127. data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
  128. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
  129. data/lib/generators/doorkeeper/templates/{add_previous_refresh_token_to_access_tokens.rb → add_previous_refresh_token_to_access_tokens.rb.erb} +3 -1
  130. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  131. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  132. data/lib/generators/doorkeeper/templates/initializer.rb +410 -31
  133. data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
  134. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  135. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  136. metadata +132 -286
  137. data/.gitignore +0 -14
  138. data/.hound.yml +0 -13
  139. data/.rspec +0 -1
  140. data/.travis.yml +0 -20
  141. data/CONTRIBUTING.md +0 -47
  142. data/Gemfile +0 -14
  143. data/NEWS.md +0 -593
  144. data/RELEASING.md +0 -17
  145. data/Rakefile +0 -20
  146. data/app/validators/redirect_uri_validator.rb +0 -34
  147. data/doorkeeper.gemspec +0 -28
  148. data/lib/doorkeeper/oauth/client/methods.rb +0 -18
  149. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  150. data/lib/doorkeeper/oauth/request_concern.rb +0 -48
  151. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
  152. data/lib/generators/doorkeeper/templates/migration.rb +0 -68
  153. data/spec/controllers/application_metal_controller.rb +0 -10
  154. data/spec/controllers/applications_controller_spec.rb +0 -58
  155. data/spec/controllers/authorizations_controller_spec.rb +0 -189
  156. data/spec/controllers/protected_resources_controller_spec.rb +0 -300
  157. data/spec/controllers/token_info_controller_spec.rb +0 -52
  158. data/spec/controllers/tokens_controller_spec.rb +0 -88
  159. data/spec/dummy/Rakefile +0 -7
  160. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  161. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  162. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  163. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  164. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  165. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  166. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  167. data/spec/dummy/app/models/user.rb +0 -5
  168. data/spec/dummy/app/views/home/index.html.erb +0 -0
  169. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  170. data/spec/dummy/config/application.rb +0 -23
  171. data/spec/dummy/config/boot.rb +0 -9
  172. data/spec/dummy/config/database.yml +0 -15
  173. data/spec/dummy/config/environment.rb +0 -5
  174. data/spec/dummy/config/environments/development.rb +0 -29
  175. data/spec/dummy/config/environments/production.rb +0 -62
  176. data/spec/dummy/config/environments/test.rb +0 -44
  177. data/spec/dummy/config/initializers/active_record_belongs_to_required_by_default.rb +0 -6
  178. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  179. data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
  180. data/spec/dummy/config/initializers/secret_token.rb +0 -9
  181. data/spec/dummy/config/initializers/session_store.rb +0 -8
  182. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  183. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  184. data/spec/dummy/config/routes.rb +0 -52
  185. data/spec/dummy/config.ru +0 -4
  186. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
  187. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
  188. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -60
  189. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -7
  190. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -11
  191. data/spec/dummy/db/schema.rb +0 -67
  192. data/spec/dummy/public/404.html +0 -26
  193. data/spec/dummy/public/422.html +0 -26
  194. data/spec/dummy/public/500.html +0 -26
  195. data/spec/dummy/public/favicon.ico +0 -0
  196. data/spec/dummy/script/rails +0 -6
  197. data/spec/factories.rb +0 -28
  198. data/spec/generators/application_owner_generator_spec.rb +0 -22
  199. data/spec/generators/install_generator_spec.rb +0 -31
  200. data/spec/generators/migration_generator_spec.rb +0 -20
  201. data/spec/generators/templates/routes.rb +0 -3
  202. data/spec/generators/views_generator_spec.rb +0 -27
  203. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  204. data/spec/lib/config_spec.rb +0 -334
  205. data/spec/lib/doorkeeper_spec.rb +0 -28
  206. data/spec/lib/models/expirable_spec.rb +0 -51
  207. data/spec/lib/models/revocable_spec.rb +0 -59
  208. data/spec/lib/models/scopes_spec.rb +0 -43
  209. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -42
  210. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
  211. data/spec/lib/oauth/client/credentials_spec.rb +0 -47
  212. data/spec/lib/oauth/client/methods_spec.rb +0 -54
  213. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  214. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  215. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  216. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  217. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
  218. data/spec/lib/oauth/client_spec.rb +0 -39
  219. data/spec/lib/oauth/code_request_spec.rb +0 -45
  220. data/spec/lib/oauth/code_response_spec.rb +0 -34
  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 -154
  231. data/spec/lib/oauth/scopes_spec.rb +0 -122
  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 -116
  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 -394
  239. data/spec/models/doorkeeper/application_spec.rb +0 -179
  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 -115
  250. data/spec/requests/flows/refresh_token_spec.rb +0 -174
  251. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  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 -59
  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 -67
  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/http_method_shim.rb +0 -24
  268. data/spec/support/orm/active_record.rb +0 -3
  269. data/spec/support/shared/controllers_shared_context.rb +0 -69
  270. data/spec/support/shared/models_shared_examples.rb +0 -52
  271. data/spec/validators/redirect_uri_validator_spec.rb +0 -78
@@ -1,59 +0,0 @@
1
- ENV['RAILS_ENV'] ||= 'test'
2
- TABLE_NAME_PREFIX = ENV['table_name_prefix'] || nil
3
- TABLE_NAME_SUFFIX = ENV['table_name_suffix'] || nil
4
-
5
- orm = (ENV['BUNDLE_GEMFILE'] || '').match(/Gemfile\.(.+)\.rb/)
6
- DOORKEEPER_ORM = (orm && orm[1] || :active_record).to_sym
7
-
8
- $LOAD_PATH.unshift File.dirname(__FILE__)
9
-
10
- require 'capybara/rspec'
11
- require 'dummy/config/environment'
12
- require 'rspec/rails'
13
- require 'generator_spec/test_case'
14
- require 'timecop'
15
- require 'database_cleaner'
16
-
17
- # Load JRuby SQLite3 if in that platform
18
- begin
19
- require 'jdbc/sqlite3'
20
- Jdbc::SQLite3.load_driver
21
- rescue LoadError
22
- end
23
-
24
- Rails.logger.info "====> Doorkeeper.orm = #{Doorkeeper.configuration.orm.inspect}"
25
- if Doorkeeper.configuration.orm == :active_record
26
- Rails.logger.info "======> active_record.table_name_prefix = #{Rails.configuration.active_record.table_name_prefix.inspect}"
27
- Rails.logger.info "======> active_record.table_name_suffix = #{Rails.configuration.active_record.table_name_suffix.inspect}"
28
- end
29
- Rails.logger.info "====> Rails version: #{Rails.version}"
30
- Rails.logger.info "====> Ruby version: #{RUBY_VERSION}"
31
-
32
- require "support/orm/#{DOORKEEPER_ORM}"
33
-
34
- ENGINE_RAILS_ROOT = File.join(File.dirname(__FILE__), '../')
35
-
36
- Dir["#{File.dirname(__FILE__)}/support/{dependencies,helpers,shared}/*.rb"].each { |f| require f }
37
-
38
- # Remove after dropping support of Rails 4.2
39
- require "#{File.dirname(__FILE__)}/support/http_method_shim.rb"
40
-
41
- RSpec.configure do |config|
42
- config.infer_spec_type_from_file_location!
43
- config.mock_with :rspec
44
-
45
- config.infer_base_class_for_anonymous_controllers = false
46
-
47
- config.include RSpec::Rails::RequestExampleGroup, type: :request
48
-
49
- config.before do
50
- DatabaseCleaner.start
51
- Doorkeeper.configure { orm DOORKEEPER_ORM }
52
- end
53
-
54
- config.after do
55
- DatabaseCleaner.clean
56
- end
57
-
58
- config.order = 'random'
59
- end
@@ -1,2 +0,0 @@
1
- require 'factory_girl'
2
- FactoryGirl.find_definitions
@@ -1,11 +0,0 @@
1
- module AccessTokenRequestHelper
2
- def client_is_authorized(client, resource_owner, access_token_attributes = {})
3
- attributes = {
4
- application: client,
5
- resource_owner_id: resource_owner.id
6
- }.merge(access_token_attributes)
7
- FactoryGirl.create(:access_token, attributes)
8
- end
9
- end
10
-
11
- RSpec.configuration.send :include, AccessTokenRequestHelper
@@ -1,41 +0,0 @@
1
- module AuthorizationRequestHelper
2
- def resource_owner_is_authenticated(resource_owner = nil)
3
- resource_owner ||= User.create!(name: 'Joe', password: 'sekret')
4
- Doorkeeper.configuration.instance_variable_set(:@authenticate_resource_owner, proc { resource_owner })
5
- end
6
-
7
- def resource_owner_is_not_authenticated
8
- Doorkeeper.configuration.instance_variable_set(:@authenticate_resource_owner, proc { redirect_to('/sign_in') })
9
- end
10
-
11
- def default_scopes_exist(*scopes)
12
- Doorkeeper.configuration.instance_variable_set(:@default_scopes, Doorkeeper::OAuth::Scopes.from_array(scopes))
13
- end
14
-
15
- def optional_scopes_exist(*scopes)
16
- Doorkeeper.configuration.instance_variable_set(:@optional_scopes, Doorkeeper::OAuth::Scopes.from_array(scopes))
17
- end
18
-
19
- def client_should_be_authorized(client)
20
- expect(client.access_grants.size).to eq(1)
21
- end
22
-
23
- def client_should_not_be_authorized(client)
24
- expect(client.size).to eq(0)
25
- end
26
-
27
- def i_should_be_on_client_callback(client)
28
- expect(client.redirect_uri).to eq("#{current_uri.scheme}://#{current_uri.host}#{current_uri.path}")
29
- end
30
-
31
- def allowing_forgery_protection(&block)
32
- _original_value = ActionController::Base.allow_forgery_protection
33
- ActionController::Base.allow_forgery_protection = true
34
-
35
- block.call
36
- ensure
37
- ActionController::Base.allow_forgery_protection = _original_value
38
- end
39
- end
40
-
41
- RSpec.configuration.send :include, AuthorizationRequestHelper
@@ -1,9 +0,0 @@
1
- module ConfigHelper
2
- def config_is_set(setting, value = nil, &block)
3
- setting_ivar = "@#{setting}"
4
- value = block_given? ? block : value
5
- Doorkeeper.configuration.instance_variable_set(setting_ivar, value)
6
- end
7
- end
8
-
9
- RSpec.configuration.send :include, ConfigHelper
@@ -1,67 +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
-
17
- expect(grant.application).to have_attributes(id: client.id).
18
- and(be_instance_of(Doorkeeper::Application))
19
-
20
- expect(grant.resource_owner_id).to eq(resource_owner.id)
21
- end
22
-
23
- def access_token_should_exist_for(client, resource_owner)
24
- token = Doorkeeper::AccessToken.first
25
-
26
- expect(token.application).to have_attributes(id: client.id).
27
- and(be_instance_of(Doorkeeper::Application))
28
-
29
- expect(token.resource_owner_id).to eq(resource_owner.id)
30
- end
31
-
32
- def access_grant_should_not_exist
33
- expect(Doorkeeper::AccessGrant.all).to be_empty
34
- end
35
-
36
- def access_token_should_not_exist
37
- expect(Doorkeeper::AccessToken.all).to be_empty
38
- end
39
-
40
- def access_grant_should_have_scopes(*args)
41
- grant = Doorkeeper::AccessGrant.first
42
- expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
43
- end
44
-
45
- def access_token_should_have_scopes(*args)
46
- grant = Doorkeeper::AccessToken.last
47
- expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
48
- end
49
-
50
- def uniqueness_error
51
- case DOORKEEPER_ORM
52
- when :active_record
53
- ActiveRecord::RecordNotUnique
54
- when :sequel
55
- error_classes = [Sequel::UniqueConstraintViolation, Sequel::ValidationFailed]
56
- proc { |error| expect(error.class).to be_in(error_classes) }
57
- when :mongo_mapper
58
- MongoMapper::DocumentNotValid
59
- when /mongoid/
60
- Mongoid::Errors::Validations
61
- else
62
- raise "'#{DOORKEEPER_ORM}' ORM is not supported!"
63
- end
64
- end
65
- end
66
-
67
- 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,24 +0,0 @@
1
- # Rails 5 deprecates calling HTTP action methods with positional arguments
2
- # in favor of keyword arguments. However, the keyword argument form is only
3
- # supported in Rails 5+. Since we support back to 4, we need some sort of shim
4
- # to avoid super noisy deprecations when running tests.
5
- module HTTPMethodShim
6
- def get(path, params = nil, headers = nil)
7
- super(path, params: params, headers: headers)
8
- end
9
-
10
- def post(path, params = nil, headers = nil)
11
- super(path, params: params, headers: headers)
12
- end
13
-
14
- def put(path, params = nil, headers = nil)
15
- super(path, params: params, headers: headers)
16
- end
17
- end
18
-
19
- if ::Rails::VERSION::MAJOR >= 5
20
- RSpec.configure do |config|
21
- config.include HTTPMethodShim, type: :controller
22
- config.include HTTPMethodShim, type: :request
23
- end
24
- end
@@ -1,3 +0,0 @@
1
- # load schema to in memory sqlite
2
- ActiveRecord::Migration.verbose = false
3
- load Rails.root + 'db/schema.rb'
@@ -1,69 +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,
8
- accessible?: true, includes_scope?: true, acceptable?: true,
9
- previous_refresh_token: "", revoke_previous_refresh_token!: true)
10
- end
11
-
12
- before :each do
13
- allow(
14
- Doorkeeper::AccessToken
15
- ).to receive(:by_token).with(token_string).and_return(token)
16
- end
17
- end
18
-
19
- shared_context 'invalid token', token: :invalid do
20
- let :token_string do
21
- '1A2B3C4D'
22
- end
23
-
24
- let :token do
25
- double(Doorkeeper::AccessToken,
26
- accessible?: false, revoked?: false, expired?: false,
27
- includes_scope?: false, acceptable?: false,
28
- previous_refresh_token: "", revoke_previous_refresh_token!: true)
29
- end
30
-
31
- before :each do
32
- allow(
33
- Doorkeeper::AccessToken
34
- ).to receive(:by_token).with(token_string).and_return(token)
35
- end
36
- end
37
-
38
- shared_context 'authenticated resource owner' do
39
- before do
40
- user = double(:resource, id: 1)
41
- allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { user } }
42
- end
43
- end
44
-
45
- shared_context 'not authenticated resource owner' do
46
- before do
47
- allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { redirect_to '/' } }
48
- end
49
- end
50
-
51
- shared_context 'valid authorization request' do
52
- let :authorization do
53
- double(:authorization, valid?: true, authorize: true, success_redirect_uri: 'http://something.com/cb?code=token')
54
- end
55
-
56
- before do
57
- allow(controller).to receive(:authorization) { authorization }
58
- end
59
- end
60
-
61
- shared_context 'invalid authorization request' do
62
- let :authorization do
63
- double(:authorization, valid?: false, authorize: false, redirect_on_error?: false)
64
- end
65
-
66
- before do
67
- allow(controller).to receive(:authorization) { authorization }
68
- end
69
- 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(uniqueness_error)
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