couchkeeper 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. data/.gitignore +14 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +28 -0
  4. data/CHANGELOG.md +198 -0
  5. data/Gemfile +32 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +290 -0
  8. data/Rakefile +18 -0
  9. data/app/assets/javascripts/doorkeeper/application.js +2 -0
  10. data/app/assets/stylesheets/doorkeeper/application.css +18 -0
  11. data/app/assets/stylesheets/doorkeeper/form.css +13 -0
  12. data/app/controllers/doorkeeper/application_controller.rb +7 -0
  13. data/app/controllers/doorkeeper/applications_controller.rb +60 -0
  14. data/app/controllers/doorkeeper/authorizations_controller.rb +57 -0
  15. data/app/controllers/doorkeeper/authorized_applications_controller.rb +12 -0
  16. data/app/controllers/doorkeeper/token_info_controller.rb +12 -0
  17. data/app/controllers/doorkeeper/tokens_controller.rb +20 -0
  18. data/app/helpers/doorkeeper/form_errors_helper.rb +9 -0
  19. data/app/validators/redirect_uri_validator.rb +23 -0
  20. data/app/views/doorkeeper/applications/_form.html.erb +34 -0
  21. data/app/views/doorkeeper/applications/edit.html.erb +13 -0
  22. data/app/views/doorkeeper/applications/index.html.erb +29 -0
  23. data/app/views/doorkeeper/applications/new.html.erb +13 -0
  24. data/app/views/doorkeeper/applications/show.html.erb +26 -0
  25. data/app/views/doorkeeper/authorizations/error.html.erb +6 -0
  26. data/app/views/doorkeeper/authorizations/new.html.erb +37 -0
  27. data/app/views/doorkeeper/authorizations/show.html.erb +4 -0
  28. data/app/views/doorkeeper/authorized_applications/index.html.erb +25 -0
  29. data/app/views/layouts/doorkeeper/application.html.erb +33 -0
  30. data/config/locales/en.yml +68 -0
  31. data/doorkeeper.gemspec +28 -0
  32. data/lib/doorkeeper.rb +64 -0
  33. data/lib/doorkeeper/config.rb +194 -0
  34. data/lib/doorkeeper/doorkeeper_for.rb +76 -0
  35. data/lib/doorkeeper/engine.rb +19 -0
  36. data/lib/doorkeeper/errors.rb +15 -0
  37. data/lib/doorkeeper/helpers/controller.rb +58 -0
  38. data/lib/doorkeeper/helpers/filter.rb +38 -0
  39. data/lib/doorkeeper/models/access_grant.rb +24 -0
  40. data/lib/doorkeeper/models/access_token.rb +95 -0
  41. data/lib/doorkeeper/models/accessible.rb +9 -0
  42. data/lib/doorkeeper/models/active_record/access_grant.rb +5 -0
  43. data/lib/doorkeeper/models/active_record/access_token.rb +21 -0
  44. data/lib/doorkeeper/models/active_record/application.rb +20 -0
  45. data/lib/doorkeeper/models/application.rb +33 -0
  46. data/lib/doorkeeper/models/couchbase/access_grant.rb +10 -0
  47. data/lib/doorkeeper/models/couchbase/access_token.rb +7 -0
  48. data/lib/doorkeeper/models/couchbase/application.rb +35 -0
  49. data/lib/doorkeeper/models/doorkeeper_access_grant/by_token/map.js +5 -0
  50. data/lib/doorkeeper/models/doorkeeper_access_token/by_application_id/map.js +5 -0
  51. data/lib/doorkeeper/models/doorkeeper_access_token/by_application_id_and_resource_owner_id/map.js +5 -0
  52. data/lib/doorkeeper/models/doorkeeper_access_token/by_refresh_token/map.js +5 -0
  53. data/lib/doorkeeper/models/doorkeeper_access_token/by_resource_owner_id/map.js +5 -0
  54. data/lib/doorkeeper/models/doorkeeper_access_token/by_token/map.js +5 -0
  55. data/lib/doorkeeper/models/doorkeeper_application/by_uid/map.js +5 -0
  56. data/lib/doorkeeper/models/doorkeeper_application/by_uid_and_secret/map.js +5 -0
  57. data/lib/doorkeeper/models/doorkeeper_application/show_all/map.js +6 -0
  58. data/lib/doorkeeper/models/expirable.rb +21 -0
  59. data/lib/doorkeeper/models/mongo_mapper/access_grant.rb +28 -0
  60. data/lib/doorkeeper/models/mongo_mapper/access_token.rb +51 -0
  61. data/lib/doorkeeper/models/mongo_mapper/application.rb +30 -0
  62. data/lib/doorkeeper/models/mongo_mapper/revocable.rb +15 -0
  63. data/lib/doorkeeper/models/mongoid/revocable.rb +15 -0
  64. data/lib/doorkeeper/models/mongoid/scopes.rb +15 -0
  65. data/lib/doorkeeper/models/mongoid2/access_grant.rb +22 -0
  66. data/lib/doorkeeper/models/mongoid2/access_token.rb +41 -0
  67. data/lib/doorkeeper/models/mongoid2/application.rb +22 -0
  68. data/lib/doorkeeper/models/mongoid3/access_grant.rb +22 -0
  69. data/lib/doorkeeper/models/mongoid3/access_token.rb +41 -0
  70. data/lib/doorkeeper/models/mongoid3/application.rb +22 -0
  71. data/lib/doorkeeper/models/ownership.rb +16 -0
  72. data/lib/doorkeeper/models/scopes.rb +17 -0
  73. data/lib/doorkeeper/oauth/authorization.rb +10 -0
  74. data/lib/doorkeeper/oauth/authorization/code.rb +32 -0
  75. data/lib/doorkeeper/oauth/authorization/token.rb +28 -0
  76. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +29 -0
  77. data/lib/doorkeeper/oauth/authorization_code_request.rb +82 -0
  78. data/lib/doorkeeper/oauth/client.rb +29 -0
  79. data/lib/doorkeeper/oauth/client/credentials.rb +21 -0
  80. data/lib/doorkeeper/oauth/client/methods.rb +18 -0
  81. data/lib/doorkeeper/oauth/client_credentials/creator.rb +29 -0
  82. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +35 -0
  83. data/lib/doorkeeper/oauth/client_credentials/validation.rb +33 -0
  84. data/lib/doorkeeper/oauth/client_credentials_request.rb +47 -0
  85. data/lib/doorkeeper/oauth/code_request.rb +28 -0
  86. data/lib/doorkeeper/oauth/code_response.rb +37 -0
  87. data/lib/doorkeeper/oauth/error.rb +9 -0
  88. data/lib/doorkeeper/oauth/error_response.rb +44 -0
  89. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +18 -0
  90. data/lib/doorkeeper/oauth/helpers/unique_token.rb +13 -0
  91. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +32 -0
  92. data/lib/doorkeeper/oauth/password_access_token_request.rb +84 -0
  93. data/lib/doorkeeper/oauth/pre_authorization.rb +62 -0
  94. data/lib/doorkeeper/oauth/refresh_token_request.rb +58 -0
  95. data/lib/doorkeeper/oauth/scopes.rb +60 -0
  96. data/lib/doorkeeper/oauth/token.rb +36 -0
  97. data/lib/doorkeeper/oauth/token_request.rb +28 -0
  98. data/lib/doorkeeper/oauth/token_response.rb +29 -0
  99. data/lib/doorkeeper/rails/routes.rb +90 -0
  100. data/lib/doorkeeper/rails/routes/mapper.rb +28 -0
  101. data/lib/doorkeeper/rails/routes/mapping.rb +39 -0
  102. data/lib/doorkeeper/request.rb +33 -0
  103. data/lib/doorkeeper/request/authorization_code.rb +23 -0
  104. data/lib/doorkeeper/request/client_credentials.rb +23 -0
  105. data/lib/doorkeeper/request/code.rb +24 -0
  106. data/lib/doorkeeper/request/password.rb +23 -0
  107. data/lib/doorkeeper/request/refresh_token.rb +23 -0
  108. data/lib/doorkeeper/request/token.rb +24 -0
  109. data/lib/doorkeeper/server.rb +54 -0
  110. data/lib/doorkeeper/validations.rb +30 -0
  111. data/lib/doorkeeper/version.rb +3 -0
  112. data/lib/generators/doorkeeper/application_owner_generator.rb +15 -0
  113. data/lib/generators/doorkeeper/install_generator.rb +12 -0
  114. data/lib/generators/doorkeeper/migration_generator.rb +15 -0
  115. data/lib/generators/doorkeeper/mongo_mapper/indexes_generator.rb +12 -0
  116. data/lib/generators/doorkeeper/templates/README +44 -0
  117. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +7 -0
  118. data/lib/generators/doorkeeper/templates/indexes.rb +3 -0
  119. data/lib/generators/doorkeeper/templates/initializer.rb +67 -0
  120. data/lib/generators/doorkeeper/templates/migration.rb +42 -0
  121. data/lib/generators/doorkeeper/views_generator.rb +15 -0
  122. data/script/rails +6 -0
  123. data/script/run_all +14 -0
  124. data/spec/controllers/applications_controller_spec.rb +18 -0
  125. data/spec/controllers/authorizations_controller_spec.rb +154 -0
  126. data/spec/controllers/protected_resources_controller_spec.rb +304 -0
  127. data/spec/controllers/token_info_controller_spec.rb +54 -0
  128. data/spec/controllers/tokens_controller_spec.rb +36 -0
  129. data/spec/dummy/Rakefile +7 -0
  130. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  131. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  132. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  133. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +7 -0
  134. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +12 -0
  135. data/spec/dummy/app/controllers/home_controller.rb +17 -0
  136. data/spec/dummy/app/controllers/metal_controller.rb +11 -0
  137. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +11 -0
  138. data/spec/dummy/app/helpers/application_helper.rb +5 -0
  139. data/spec/dummy/app/models/user.rb +27 -0
  140. data/spec/dummy/app/views/home/index.html.erb +0 -0
  141. data/spec/dummy/app/views/layouts/application.html.erb +16 -0
  142. data/spec/dummy/config.ru +4 -0
  143. data/spec/dummy/config/application.rb +54 -0
  144. data/spec/dummy/config/boot.rb +6 -0
  145. data/spec/dummy/config/database.yml +15 -0
  146. data/spec/dummy/config/environment.rb +5 -0
  147. data/spec/dummy/config/environments/development.rb +30 -0
  148. data/spec/dummy/config/environments/production.rb +60 -0
  149. data/spec/dummy/config/environments/test.rb +39 -0
  150. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  151. data/spec/dummy/config/initializers/doorkeeper.rb +56 -0
  152. data/spec/dummy/config/initializers/secret_token.rb +9 -0
  153. data/spec/dummy/config/initializers/session_store.rb +8 -0
  154. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  155. data/spec/dummy/config/locales/doorkeeper.en.yml +5 -0
  156. data/spec/dummy/config/mongo.yml +11 -0
  157. data/spec/dummy/config/mongoid2.yml +9 -0
  158. data/spec/dummy/config/mongoid3.yml +18 -0
  159. data/spec/dummy/config/routes.rb +38 -0
  160. data/spec/dummy/db/migrate/20111122132257_create_users.rb +9 -0
  161. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +5 -0
  162. data/spec/dummy/db/migrate/20120524202412_create_doorkeeper_tables.rb +44 -0
  163. data/spec/dummy/db/schema.rb +64 -0
  164. data/spec/dummy/public/404.html +26 -0
  165. data/spec/dummy/public/422.html +26 -0
  166. data/spec/dummy/public/500.html +26 -0
  167. data/spec/dummy/public/favicon.ico +0 -0
  168. data/spec/dummy/script/rails +6 -0
  169. data/spec/factories/access_grant.rb +9 -0
  170. data/spec/factories/access_token.rb +7 -0
  171. data/spec/factories/application.rb +6 -0
  172. data/spec/generators/application_owner_generator_spec.rb +23 -0
  173. data/spec/generators/install_generator_spec.rb +31 -0
  174. data/spec/generators/migration_generator_spec.rb +20 -0
  175. data/spec/generators/templates/routes.rb +3 -0
  176. data/spec/generators/views_generator_spec.rb +27 -0
  177. data/spec/lib/config_spec.rb +170 -0
  178. data/spec/lib/models/expirable_spec.rb +51 -0
  179. data/spec/lib/models/revocable_spec.rb +31 -0
  180. data/spec/lib/models/scopes_spec.rb +32 -0
  181. data/spec/lib/oauth/authorization/uri_builder_spec.rb +37 -0
  182. data/spec/lib/oauth/authorization_code_request_spec.rb +80 -0
  183. data/spec/lib/oauth/client/credentials_spec.rb +47 -0
  184. data/spec/lib/oauth/client/methods_spec.rb +54 -0
  185. data/spec/lib/oauth/client_credentials/creator_spec.rb +47 -0
  186. data/spec/lib/oauth/client_credentials/issuer_spec.rb +57 -0
  187. data/spec/lib/oauth/client_credentials/validation_spec.rb +29 -0
  188. data/spec/lib/oauth/client_credentials_integration_spec.rb +27 -0
  189. data/spec/lib/oauth/client_credentials_request_spec.rb +64 -0
  190. data/spec/lib/oauth/client_spec.rb +39 -0
  191. data/spec/lib/oauth/code_request_spec.rb +44 -0
  192. data/spec/lib/oauth/error_response_spec.rb +40 -0
  193. data/spec/lib/oauth/error_spec.rb +19 -0
  194. data/spec/lib/oauth/helpers/scope_checker_spec.rb +74 -0
  195. data/spec/lib/oauth/helpers/unique_token_spec.rb +20 -0
  196. data/spec/lib/oauth/helpers/uri_checker_spec.rb +64 -0
  197. data/spec/lib/oauth/password_access_token_request_spec.rb +65 -0
  198. data/spec/lib/oauth/pre_authorization_spec.rb +80 -0
  199. data/spec/lib/oauth/refresh_token_request_spec.rb +56 -0
  200. data/spec/lib/oauth/scopes_spec.rb +115 -0
  201. data/spec/lib/oauth/token_request_spec.rb +46 -0
  202. data/spec/lib/oauth/token_response_spec.rb +52 -0
  203. data/spec/lib/oauth/token_spec.rb +83 -0
  204. data/spec/lib/server_spec.rb +24 -0
  205. data/spec/models/doorkeeper/access_grant_spec.rb +36 -0
  206. data/spec/models/doorkeeper/access_token_spec.rb +153 -0
  207. data/spec/models/doorkeeper/application_spec.rb +162 -0
  208. data/spec/requests/applications/applications_request_spec.rb +92 -0
  209. data/spec/requests/applications/authorized_applications_spec.rb +30 -0
  210. data/spec/requests/endpoints/authorization_spec.rb +47 -0
  211. data/spec/requests/endpoints/token_spec.rb +46 -0
  212. data/spec/requests/flows/authorization_code_errors_spec.rb +66 -0
  213. data/spec/requests/flows/authorization_code_spec.rb +135 -0
  214. data/spec/requests/flows/client_credentials_spec.rb +58 -0
  215. data/spec/requests/flows/implicit_grant_errors_spec.rb +31 -0
  216. data/spec/requests/flows/implicit_grant_spec.rb +19 -0
  217. data/spec/requests/flows/password_spec.rb +78 -0
  218. data/spec/requests/flows/refresh_token_spec.rb +71 -0
  219. data/spec/requests/flows/skip_authorization_spec.rb +40 -0
  220. data/spec/requests/protected_resources/metal_spec.rb +14 -0
  221. data/spec/requests/protected_resources/private_api_spec.rb +50 -0
  222. data/spec/routing/custom_controller_routes_spec.rb +44 -0
  223. data/spec/routing/default_routes_spec.rb +32 -0
  224. data/spec/spec_helper.rb +2 -0
  225. data/spec/spec_helper_integration.rb +40 -0
  226. data/spec/support/dependencies/factory_girl.rb +2 -0
  227. data/spec/support/helpers/access_token_request_helper.rb +11 -0
  228. data/spec/support/helpers/authorization_request_helper.rb +32 -0
  229. data/spec/support/helpers/config_helper.rb +9 -0
  230. data/spec/support/helpers/model_helper.rb +45 -0
  231. data/spec/support/helpers/request_spec_helper.rb +72 -0
  232. data/spec/support/helpers/url_helper.rb +51 -0
  233. data/spec/support/orm/active_record.rb +11 -0
  234. data/spec/support/orm/mongo_mapper.rb +26 -0
  235. data/spec/support/orm/mongoid.rb +31 -0
  236. data/spec/support/shared/controllers_shared_context.rb +60 -0
  237. data/spec/support/shared/models_shared_examples.rb +60 -0
  238. data/spec/validators/redirect_uri_validator_spec.rb +47 -0
  239. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +356 -0
  240. metadata +430 -0
@@ -0,0 +1,7 @@
1
+ class AddOwnerToApplication < ActiveRecord::Migration
2
+ def change
3
+ add_column :oauth_applications, :owner_id, :integer, :null => true
4
+ add_column :oauth_applications, :owner_type, :string, :null => true
5
+ add_index :oauth_applications, [:owner_id, :owner_type]
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ Doorkeeper::Application.create_indexes
2
+ Doorkeeper::AccessGrant.create_indexes
3
+ Doorkeeper::AccessToken.create_indexes
@@ -0,0 +1,67 @@
1
+ Doorkeeper.configure do
2
+ # Change the ORM that doorkeeper will use.
3
+ # Currently supported options are :active_record, :mongoid2, :mongoid3, :mongo_mapper
4
+ orm :active_record
5
+
6
+ # This block will be called to check whether the resource owner is authenticated or not.
7
+ resource_owner_authenticator do
8
+ raise "Please configure doorkeeper resource_owner_authenticator block located in #{__FILE__}"
9
+ # Put your resource owner authentication logic here.
10
+ # Example implementation:
11
+ # User.find_by_id(session[:user_id]) || redirect_to(new_user_session_url)
12
+ end
13
+
14
+ # If you want to restrict access to the web interface for adding oauth authorized applications, you need to declare the block below.
15
+ # admin_authenticator do
16
+ # # Put your admin authentication logic here.
17
+ # # Example implementation:
18
+ # Admin.find_by_id(session[:admin_id]) || redirect_to(new_admin_session_url)
19
+ # end
20
+
21
+ # Authorization Code expiration time (default 10 minutes).
22
+ # authorization_code_expires_in 10.minutes
23
+
24
+ # Access token expiration time (default 2 hours).
25
+ # If you want to disable expiration, set this to nil.
26
+ # access_token_expires_in 2.hours
27
+
28
+ # Issue access tokens with refresh token (disabled by default)
29
+ # use_refresh_token
30
+
31
+ # Provide support for an owner to be assigned to each registered application (disabled by default)
32
+ # Optional parameter :confirmation => true (default false) if you want to enforce ownership of
33
+ # a registered application
34
+ # Note: you must also run the rails g doorkeeper:application_owner generator to provide the necessary support
35
+ # enable_application_owner :confirmation => false
36
+
37
+ # Define access token scopes for your provider
38
+ # For more information go to https://github.com/applicake/doorkeeper/wiki/Using-Scopes
39
+ # default_scopes :public
40
+ # optional_scopes :write, :update
41
+
42
+ # Change the way client credentials are retrieved from the request object.
43
+ # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then
44
+ # falls back to the `:client_id` and `:client_secret` params from the `params` object.
45
+ # Check out the wiki for more information on customization
46
+ # client_credentials :from_basic, :from_params
47
+
48
+ # Change the way access token is authenticated from the request object.
49
+ # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then
50
+ # falls back to the `:access_token` or `:bearer_token` params from the `params` object.
51
+ # Check out the wiki for mor information on customization
52
+ # access_token_methods :from_bearer_authorization, :from_access_token_param, :from_bearer_param
53
+
54
+ # Change the test redirect uri for client apps
55
+ # When clients register with the following redirect uri, they won't be redirected to any server and the authorization code will be displayed within the provider
56
+ # The value can be any string. Use nil to disable this feature. When disabled, clients must provide a valid URL
57
+ # (Similar behaviour: https://developers.google.com/accounts/docs/OAuth2InstalledApp#choosingredirecturi)
58
+ #
59
+ # test_redirect_uri 'urn:ietf:wg:oauth:2.0:oob'
60
+
61
+ # Under some circumstances you might want to have applications auto-approved,
62
+ # so that the user skips the authorization step.
63
+ # For example if dealing with trusted a application.
64
+ # skip_authorization do |resource_owner, client|
65
+ # client.superapp? or resource_owner.admin?
66
+ # end
67
+ end
@@ -0,0 +1,42 @@
1
+ class CreateDoorkeeperTables < ActiveRecord::Migration
2
+ def change
3
+ create_table :oauth_applications do |t|
4
+ t.string :name, :null => false
5
+ t.string :uid, :null => false
6
+ t.string :secret, :null => false
7
+ t.string :redirect_uri, :null => false
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :oauth_applications, :uid, :unique => true
12
+
13
+ create_table :oauth_access_grants do |t|
14
+ t.integer :resource_owner_id, :null => false
15
+ t.integer :application_id, :null => false
16
+ t.string :token, :null => false
17
+ t.integer :expires_in, :null => false
18
+ t.string :redirect_uri, :null => false
19
+ t.datetime :created_at, :null => false
20
+ t.datetime :revoked_at
21
+ t.string :scopes
22
+ end
23
+
24
+ add_index :oauth_access_grants, :token, :unique => true
25
+
26
+ create_table :oauth_access_tokens do |t|
27
+ t.integer :resource_owner_id
28
+ t.integer :application_id, :null => false
29
+ t.string :token, :null => false
30
+ t.string :refresh_token
31
+ t.integer :expires_in
32
+ t.datetime :revoked_at
33
+ t.datetime :created_at, :null => false
34
+ t.string :scopes
35
+ end
36
+
37
+ add_index :oauth_access_tokens, :token, :unique => true
38
+ add_index :oauth_access_tokens, :resource_owner_id
39
+ add_index :oauth_access_tokens, :refresh_token, :unique => true
40
+
41
+ end
42
+ end
@@ -0,0 +1,15 @@
1
+ module Doorkeeper
2
+ module Generators
3
+ class ViewsGenerator < ::Rails::Generators::Base
4
+ source_root File.expand_path('../../../../app/views/doorkeeper', __FILE__)
5
+
6
+ desc "Copies default Doorkeeper views to your application."
7
+
8
+ def manifest
9
+ directory 'applications', 'app/views/doorkeeper/applications'
10
+ directory 'authorizations', 'app/views/doorkeeper/authorizations'
11
+ directory 'authorized_applications', 'app/views/doorkeeper/authorized_applications'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ #!/usr/bin/env ruby
3
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
4
+
5
+ ENGINE_PATH = File.expand_path('../..', __FILE__)
6
+ load File.expand_path('../../spec/dummy/script/rails', __FILE__)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ rails=3.2.8 orm=active_record bundle install --quiet
5
+ rails=3.2.8 orm=active_record bundle exec rake
6
+
7
+ rails=3.2.8 orm=mongoid2 bundle install --quiet
8
+ rails=3.2.8 orm=mongoid2 bundle exec rake
9
+
10
+ rails=3.2.8 orm=mongoid3 bundle install --quiet
11
+ rails=3.2.8 orm=mongoid3 bundle exec rake
12
+
13
+ rails=3.2.8 orm=mongo_mapper bundle install --quiet
14
+ rails=3.2.8 orm=mongo_mapper bundle exec rake
@@ -0,0 +1,18 @@
1
+ require 'spec_helper_integration'
2
+
3
+ module Doorkeeper
4
+ describe ApplicationsController do
5
+ context "when admin is not authenticated" do
6
+ before(:each) do
7
+ Doorkeeper.configuration.stub(:authenticate_admin => proc do
8
+ redirect_to main_app.root_url
9
+ end)
10
+ end
11
+
12
+ it "redirects as set in Doorkeeper.authenticate_admin" do
13
+ get :index
14
+ expect(response).to redirect_to(controller.main_app.root_url)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,154 @@
1
+ require 'spec_helper_integration'
2
+
3
+ describe Doorkeeper::AuthorizationsController, "implicit grant flow" do
4
+ include AuthorizationRequestHelper
5
+
6
+ def fragments(param)
7
+ fragment = URI.parse(response.location).fragment
8
+ Rack::Utils.parse_query(fragment)[param]
9
+ end
10
+
11
+ def translated_error_message(key)
12
+ I18n.translate key, :scope => [:doorkeeper, :errors, :messages]
13
+ end
14
+
15
+ let(:client) { FactoryGirl.create :application }
16
+ let(:user) { User.create!(:name => "Joe", :password => "sekret") }
17
+
18
+ before do
19
+ controller.stub :current_resource_owner => user
20
+ end
21
+
22
+ describe "POST #create" do
23
+ before do
24
+ post :create, :client_id => client.uid, :response_type => "token", :redirect_uri => client.redirect_uri
25
+ end
26
+
27
+ it "redirects after authorization" do
28
+ expect(response).to be_redirect
29
+ end
30
+
31
+ it "redirects to client redirect uri" do
32
+ expect(response.location).to match(%r[^#{client.redirect_uri}])
33
+ end
34
+
35
+ it "includes access token in fragment" do
36
+ expect(fragments("access_token")).to eq(Doorkeeper::AccessToken.first.token)
37
+ end
38
+
39
+ it "includes token type in fragment" do
40
+ expect(fragments("token_type")).to eq('bearer')
41
+ end
42
+
43
+ it "includes token expiration in fragment" do
44
+ expect(fragments("expires_in").to_i).to eq(2.hours.to_i)
45
+ end
46
+
47
+ it "issues the token for the current client" do
48
+ expect(Doorkeeper::AccessToken.first.application_id).to eq(client.id)
49
+ end
50
+
51
+ it "issues the token for the current resource owner" do
52
+ expect(Doorkeeper::AccessToken.first.resource_owner_id).to eq(user.id)
53
+ end
54
+ end
55
+
56
+ describe "POST #create with errors" do
57
+ before do
58
+ default_scopes_exist :public
59
+ post :create, :client_id => client.uid, :response_type => "token", :scope => "invalid", :redirect_uri => client.redirect_uri
60
+ end
61
+
62
+ it "redirects after authorization" do
63
+ expect(response).to be_redirect
64
+ end
65
+
66
+ it "redirects to client redirect uri" do
67
+ expect(response.location).to match(%r[^#{client.redirect_uri}])
68
+ end
69
+
70
+ it "does not include access token in fragment" do
71
+ expect(fragments("access_token")).to be_nil
72
+ end
73
+
74
+ it "includes error in fragment" do
75
+ expect(fragments("error")).to eq('invalid_scope')
76
+ end
77
+
78
+ it "includes error description in fragment" do
79
+ expect(fragments("error_description")).to eq(translated_error_message(:invalid_scope))
80
+ end
81
+
82
+ it "does not issue any access token" do
83
+ expect(Doorkeeper::AccessToken.all).to be_empty
84
+ end
85
+ end
86
+
87
+ describe "POST #create with application already authorized" do
88
+ it "returns the existing access token in a fragment"
89
+ end
90
+
91
+ describe "GET #new" do
92
+ before do
93
+ get :new, :client_id => client.uid, :response_type => "token", :redirect_uri => client.redirect_uri
94
+ end
95
+
96
+ it 'renders new template' do
97
+ expect(response).to render_template(:new)
98
+ end
99
+ end
100
+
101
+ describe "GET #new with skip_authorization true" do
102
+ before do
103
+ Doorkeeper.configuration.stub(:skip_authorization => proc do
104
+ true
105
+ end)
106
+ get :new, :client_id => client.uid, :response_type => "token", :redirect_uri => client.redirect_uri
107
+ end
108
+
109
+ it "should redirect immediately" do
110
+ response.should be_redirect
111
+ response.location.should =~ %r[^#{client.redirect_uri}]
112
+ end
113
+
114
+ it "should issue a token" do
115
+ Doorkeeper::AccessToken.count.should be 1
116
+ end
117
+
118
+ it "includes token type in fragment" do
119
+ fragments("token_type").should == "bearer"
120
+ end
121
+
122
+ it "includes token expiration in fragment" do
123
+ fragments("expires_in").to_i.should == 2.hours.to_i
124
+ end
125
+
126
+ it "issues the token for the current client" do
127
+ Doorkeeper::AccessToken.first.application_id.should == client.id
128
+ end
129
+
130
+ it "issues the token for the current resource owner" do
131
+ Doorkeeper::AccessToken.first.resource_owner_id.should == user.id
132
+ end
133
+ end
134
+
135
+ describe "GET #new with errors" do
136
+ before do
137
+ default_scopes_exist :public
138
+ get :new, :an_invalid => 'request'
139
+ end
140
+
141
+ it "does not redirect" do
142
+ expect(response).to_not be_redirect
143
+ end
144
+
145
+ it 'renders error template' do
146
+ expect(response).to render_template(:error)
147
+ end
148
+
149
+ it 'does not issue any token' do
150
+ expect(Doorkeeper::AccessGrant.count).to eq 0
151
+ expect(Doorkeeper::AccessToken.count).to eq 0
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,304 @@
1
+ require 'spec_helper_integration'
2
+
3
+ module ControllerActions
4
+ def index
5
+ render :text => "index"
6
+ end
7
+
8
+ def show
9
+ render :text => "show"
10
+ end
11
+ end
12
+
13
+ shared_examples "specified for particular actions" do
14
+ context "with valid token", :token => :valid do
15
+ it "allows into index action" do
16
+ get :index, :access_token => token_string
17
+ expect(response).to be_success
18
+ end
19
+
20
+ it "allows into show action" do
21
+ get :show, :id => "3", :access_token => token_string
22
+ expect(response).to be_success
23
+ end
24
+ end
25
+
26
+ context "with invalid token", :token => :invalid do
27
+ include_context "invalid token"
28
+
29
+ it "does not allow into index action" do
30
+ get :index, :access_token => token_string
31
+ expect(response.status).to eq 401
32
+ end
33
+
34
+ it "allows into show action" do
35
+ get :show, :id => "5", :access_token => token_string
36
+ expect(response).to be_success
37
+ end
38
+ end
39
+ end
40
+
41
+ shared_examples "specified with except" do
42
+ context "with valid token", :token => :valid do
43
+ it "allows into index action" do
44
+ get :index, :access_token => token_string
45
+ expect(response).to be_success
46
+ end
47
+
48
+ it "allows into show action" do
49
+ get :show, :id => "4", :access_token => token_string
50
+ expect(response).to be_success
51
+ end
52
+ end
53
+
54
+ context "with invalid token", :token => :invalid do
55
+ it "allows into index action" do
56
+ get :index, :access_token => token_string
57
+ expect(response).to be_success
58
+ end
59
+
60
+ it "does not allow into show action" do
61
+ get :show, :id => "14", :access_token => token_string
62
+ expect(response.status).to eq 401
63
+ end
64
+ end
65
+ end
66
+
67
+ describe "Doorkeeper_for helper" do
68
+ context "accepts token code specified as" do
69
+ controller do
70
+ doorkeeper_for :all
71
+
72
+ def index
73
+ render :text => "index"
74
+ end
75
+ end
76
+
77
+ let(:token_string) { "1A2BC3" }
78
+
79
+ it "access_token param" do
80
+ Doorkeeper::AccessToken.should_receive(:authenticate).with(token_string)
81
+ get :index, :access_token => token_string
82
+ end
83
+
84
+ it "bearer_token param" do
85
+ Doorkeeper::AccessToken.should_receive(:authenticate).with(token_string)
86
+ get :index, :bearer_token => token_string
87
+ end
88
+
89
+ it "Authorization header" do
90
+ Doorkeeper::AccessToken.should_receive(:authenticate).with(token_string)
91
+ request.env["HTTP_AUTHORIZATION"] = "Bearer #{token_string}"
92
+ get :index
93
+ end
94
+
95
+ it "different kind of Authorization header" do
96
+ Doorkeeper::AccessToken.should_not_receive(:authenticate)
97
+ request.env["HTTP_AUTHORIZATION"] = "Basic #{Base64.encode64("foo:bar")}"
98
+ get :index
99
+ end
100
+
101
+ it "doesn't change Authorization header value" do
102
+ Doorkeeper::AccessToken.should_receive(:authenticate).exactly(2).times
103
+ request.env["HTTP_AUTHORIZATION"] = "Bearer #{token_string}"
104
+ get :index
105
+ get :index
106
+ end
107
+ end
108
+
109
+ context "defined for all actions" do
110
+ controller do
111
+ doorkeeper_for :all
112
+
113
+ include ControllerActions
114
+ end
115
+
116
+ context "with valid token", :token => :valid do
117
+ it "allows into index action" do
118
+ get :index, :access_token => token_string
119
+ expect(response).to be_success
120
+ end
121
+
122
+ it "allows into show action" do
123
+ get :show, :id => "4", :access_token => token_string
124
+ expect(response).to be_success
125
+ end
126
+ end
127
+
128
+ context "with invalid token", :token => :invalid do
129
+ it "does not allow into index action" do
130
+ get :index, :access_token => token_string
131
+ expect(response.status).to eq 401
132
+ end
133
+
134
+ it "does not allow into show action" do
135
+ get :show, :id => "4", :access_token => token_string
136
+ expect(response.status).to eq 401
137
+ end
138
+ end
139
+ end
140
+
141
+ context "defined only for index action" do
142
+ controller do
143
+ doorkeeper_for :index
144
+
145
+ include ControllerActions
146
+ end
147
+ include_examples "specified for particular actions"
148
+ end
149
+
150
+ context "defined for actions except index" do
151
+ controller do
152
+ doorkeeper_for :all, :except => :index
153
+
154
+ include ControllerActions
155
+ end
156
+
157
+ include_examples "specified with except"
158
+ end
159
+
160
+ context "defined with scopes" do
161
+ controller do
162
+ doorkeeper_for :all, :scopes => [:write]
163
+
164
+ include ControllerActions
165
+ end
166
+
167
+ let(:token_string) { "1A2DUWE" }
168
+
169
+ it "allows if the token has particular scopes" do
170
+ token = double(Doorkeeper::AccessToken, :accessible? => true, :scopes => [:write, :public])
171
+ Doorkeeper::AccessToken.should_receive(:authenticate).with(token_string).and_return(token)
172
+ get :index, :access_token => token_string
173
+ expect(response).to be_success
174
+ end
175
+
176
+ it "does not allow if the token does not include given scope" do
177
+ token = double(Doorkeeper::AccessToken, :accessible? => true, :scopes => [:public])
178
+ Doorkeeper::AccessToken.should_receive(:authenticate).with(token_string).and_return(token)
179
+ get :index, :access_token => token_string
180
+ expect(response.status).to eq 401
181
+ end
182
+ end
183
+
184
+ context "when custom unauthorized render options are configured" do
185
+ controller do
186
+ doorkeeper_for :all
187
+
188
+ include ControllerActions
189
+ end
190
+
191
+ context "with a JSON custom render", :token => :invalid do
192
+ before do
193
+ controller.should_receive(:doorkeeper_unauthorized_render_options).and_return({ :json => ActiveSupport::JSON.encode({ :error => "Unauthorized" }) } )
194
+ end
195
+
196
+ it "it renders a custom JSON response", :token => :invalid do
197
+ get :index, :access_token => token_string
198
+ expect(response.status).to eq 401
199
+ expect(response.content_type).to eq('application/json')
200
+ parsed_body = JSON.parse(response.body)
201
+ expect(parsed_body).not_to be_nil
202
+ expect(parsed_body['error']).to eq('Unauthorized')
203
+ end
204
+
205
+ end
206
+
207
+ context "with a text custom render", :token => :invalid do
208
+ before do
209
+ controller.should_receive(:doorkeeper_unauthorized_render_options).and_return({ :text => "Unauthorized" } )
210
+ end
211
+
212
+ it "it renders a custom JSON response", :token => :invalid do
213
+ get :index, :access_token => token_string
214
+ expect(response.status).to eq 401
215
+ expect(response.content_type).to eq('text/html')
216
+ expect(response.body.should).to eq('Unauthorized')
217
+ end
218
+ end
219
+ end
220
+
221
+ context "when defined with conditional if block" do
222
+ controller do
223
+ doorkeeper_for :index, :if => lambda { the_false }
224
+ doorkeeper_for :show, :if => lambda { the_true }
225
+
226
+ include ControllerActions
227
+
228
+ private
229
+ def the_true
230
+ true
231
+ end
232
+
233
+ def the_false
234
+ false
235
+ end
236
+ end
237
+
238
+ context "with valid token", :token => :valid do
239
+ it "enables access if passed block evaluates to false" do
240
+ get :index, :access_token => token_string
241
+ expect(response).to be_success
242
+ end
243
+
244
+ it "enables access if passed block evaluates to true" do
245
+ get :show, :id => 1, :access_token => token_string
246
+ expect(response).to be_success
247
+ end
248
+ end
249
+
250
+ context "with invalid token", :token => :invalid do
251
+ it "enables access if passed block evaluates to false" do
252
+ get :index, :access_token => token_string
253
+ expect(response).to be_success
254
+ end
255
+
256
+ it "does not enable access if passed block evaluates to true" do
257
+ get :show, :id => 3, :access_token => token_string
258
+ expect(response.status).to eq 401
259
+ end
260
+ end
261
+ end
262
+
263
+ context "when defined with conditional unless block" do
264
+ controller do
265
+ doorkeeper_for :index, :unless => lambda { the_false }
266
+ doorkeeper_for :show, :unless => lambda { the_true }
267
+
268
+ include ControllerActions
269
+
270
+ def the_true
271
+ true
272
+ end
273
+
274
+ private
275
+
276
+ def the_false
277
+ false
278
+ end
279
+ end
280
+
281
+ context "with valid token", :token => :valid do
282
+ it "allows access if passed block evaluates to false" do
283
+ get :index, :access_token => token_string
284
+ expect(response).to be_success
285
+ end
286
+
287
+ it "allows access if passed block evaluates to true" do
288
+ get :show, :id => 1, :access_token => token_string
289
+ expect(response).to be_success
290
+ end
291
+ end
292
+
293
+ context "with invalid token", :token => :invalid do
294
+ it "does not allow access if passed block evaluates to false" do
295
+ get :index, :access_token => token_string
296
+ end
297
+
298
+ it "allows access if passed block evaluates to true" do
299
+ get :show, :id => 3, :access_token => token_string
300
+ expect(response).to be_success
301
+ end
302
+ end
303
+ end
304
+ end