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,47 @@
1
+ require 'spec_helper'
2
+ require 'active_support/core_ext/string'
3
+ require 'doorkeeper/oauth/client'
4
+
5
+ class Doorkeeper::OAuth::Client
6
+ describe Credentials do
7
+ it 'is blank when any of the credentials is blank' do
8
+ Credentials.new(nil, "something").should be_blank
9
+ Credentials.new("something", nil).should be_blank
10
+ end
11
+
12
+ describe :from_request do
13
+ let(:request) { stub.as_null_object }
14
+
15
+ let(:method) do
16
+ lambda { |request| return 'uid', 'secret' }
17
+ end
18
+
19
+ it 'accepts anything that responds to #call' do
20
+ method.should_receive(:call).with(request)
21
+ Credentials.from_request request, method
22
+ end
23
+
24
+ it 'delegates methods received as symbols to Credentials class' do
25
+ Credentials.should_receive(:from_params).with(request)
26
+ Credentials.from_request request, :from_params
27
+ end
28
+
29
+ it 'stops at the first credentials found' do
30
+ not_called_method = mock
31
+ not_called_method.should_not_receive(:call)
32
+ credentials = Credentials.from_request request, lambda { |r| }, method, not_called_method
33
+ end
34
+
35
+ it 'returns new Credentials' do
36
+ credentials = Credentials.from_request request, method
37
+ credentials.should be_a(Credentials)
38
+ end
39
+
40
+ it 'returns uid and secret from extractor method' do
41
+ credentials = Credentials.from_request request, method
42
+ credentials.uid.should == 'uid'
43
+ credentials.secret.should == 'secret'
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+ require 'active_support/core_ext/string'
3
+ require 'doorkeeper/oauth/client'
4
+
5
+ class Doorkeeper::OAuth::Client
6
+ describe 'Methods' do
7
+ let(:client_id) { "some-uid" }
8
+ let(:client_secret) { "some-secret" }
9
+
10
+ subject do
11
+ Class.new do
12
+ include Methods
13
+ end.new
14
+ end
15
+
16
+ describe :from_params do
17
+ it 'returns credentials from parameters when Authorization header is not available' do
18
+ request = stub :parameters => { :client_id => client_id, :client_secret => client_secret }
19
+ uid, secret = subject.from_params(request)
20
+
21
+ uid.should == "some-uid"
22
+ secret.should == "some-secret"
23
+ end
24
+
25
+ it 'is blank when there are no credentials' do
26
+ request = stub :parameters => {}
27
+ uid, secret = subject.from_params(request)
28
+
29
+ uid.should be_blank
30
+ secret.should be_blank
31
+ end
32
+ end
33
+
34
+ describe :from_basic do
35
+ let(:credentials) { Base64.encode64("#{client_id}:#{client_secret}") }
36
+
37
+ it 'decodes the credentials' do
38
+ request = stub :authorization => "Basic #{credentials}"
39
+ uid, secret = subject.from_basic(request)
40
+
41
+ uid.should == "some-uid"
42
+ secret.should == "some-secret"
43
+ end
44
+
45
+ it 'is blank if Authorization is not Basic' do
46
+ request = stub :authorization => "#{credentials}"
47
+ uid, secret = subject.from_basic(request)
48
+
49
+ uid.should be_blank
50
+ secret.should be_blank
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper_integration'
2
+
3
+ class Doorkeeper::OAuth::ClientCredentialsRequest
4
+ describe Creator do
5
+ let(:client) { FactoryGirl.create :application }
6
+ let(:scopes) { Doorkeeper::OAuth::Scopes.from_string('public') }
7
+
8
+ it 'creates a new token' do
9
+ expect do
10
+ subject.call(client, scopes)
11
+ end.to change { Doorkeeper::AccessToken.count }.by(1)
12
+ end
13
+
14
+ it 'returns false if creation fails' do
15
+ Doorkeeper::AccessToken.should_receive(:create).and_return(false)
16
+ created = subject.call(client, scopes)
17
+ created.should be_false
18
+ end
19
+
20
+ it 'does not create a new token if there is an accessible one' do
21
+ subject.call(client, scopes, :expires_in => 10.years)
22
+ expect do
23
+ subject.call(client, scopes)
24
+ end.to_not change { Doorkeeper::AccessToken.count }
25
+ end
26
+
27
+ it 'returns the existing token if there is an accessible one' do
28
+ existing = subject.call(client, scopes, :expires_in => 10.years)
29
+ created = subject.call(client, scopes)
30
+ created.should == existing
31
+ end
32
+
33
+ it 'revokes old token if is not accessible' do
34
+ existing = subject.call(client, scopes, :expires_in => -1000)
35
+ subject.call(client, scopes)
36
+ existing.reload.should be_revoked
37
+ end
38
+
39
+ it 'returns a new token when the old one is not accessible' do
40
+ existing = subject.call(client, scopes, :expires_in => -1000)
41
+
42
+ expect do
43
+ subject.call(client, scopes)
44
+ end.to change { Doorkeeper::AccessToken.count }.by(1)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+ require 'active_support/all'
3
+ require 'doorkeeper/oauth/client_credentials/issuer'
4
+
5
+ class Doorkeeper::OAuth::ClientCredentialsRequest
6
+ describe Issuer do
7
+ let(:creator) { mock :acces_token_creator }
8
+ let(:server) { mock :server, :access_token_expires_in => 100 }
9
+ let(:validation) { mock :validation, :valid? => true }
10
+
11
+ subject { Issuer.new(server, validation) }
12
+
13
+ describe :create do
14
+ let(:client) { mock :client, :id => 'some-id' }
15
+ let(:scopes) { 'some scope' }
16
+
17
+ it 'creates and sets the token' do
18
+ creator.should_receive(:call).and_return('token')
19
+ subject.create client, scopes, creator
20
+
21
+ subject.token.should == 'token'
22
+ end
23
+
24
+ it 'creates with correct token parameters' do
25
+ creator.should_receive(:call).with(client, scopes, {
26
+ :expires_in => 100,
27
+ :use_refresh_token => false
28
+ })
29
+
30
+ subject.create client, scopes, creator
31
+ end
32
+
33
+ it 'has error set to :server_error if creator fails' do
34
+ creator.should_receive(:call).and_return(false)
35
+ subject.create client, scopes, creator
36
+
37
+ subject.error.should == :server_error
38
+ end
39
+
40
+ context 'when validation fails' do
41
+ before do
42
+ validation.stub :valid? => false, :error => :validation_error
43
+ creator.should_not_receive(:create)
44
+ end
45
+
46
+ it 'has error set from validation' do
47
+ subject.create client, scopes, creator
48
+ subject.error.should == :validation_error
49
+ end
50
+
51
+ it 'returns false' do
52
+ subject.create(client, scopes, creator).should be_false
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'active_support/all'
3
+ require 'doorkeeper/oauth/client_credentials/validation'
4
+
5
+ class Doorkeeper::OAuth::ClientCredentialsRequest
6
+ describe Validation do
7
+ let(:server) { mock :server, :scopes => nil }
8
+ let(:request) { mock :request, :client => stub, :original_scopes => nil }
9
+
10
+ subject { Validation.new(server, request) }
11
+
12
+ it 'is valid with valid request' do
13
+ subject.should be_valid
14
+ end
15
+
16
+ it 'is invalid when client is not present' do
17
+ request.stub :client => nil
18
+ subject.should_not be_valid
19
+ end
20
+
21
+ context 'with scopes' do
22
+ it 'is invalid when scopes are not included in the server' do
23
+ server.stub :scopes => Doorkeeper::OAuth::Scopes.from_string('email')
24
+ request.stub :original_scopes => 'invalid'
25
+ subject.should_not be_valid
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper_integration'
2
+
3
+ module Doorkeeper::OAuth
4
+ describe ClientCredentialsRequest do
5
+ let(:server) { Doorkeeper.configuration }
6
+
7
+ context 'with a valid request' do
8
+ let(:client) { FactoryGirl.create :application }
9
+
10
+ it 'issues an access token' do
11
+ request = ClientCredentialsRequest.new(server, client, {})
12
+ expect do
13
+ request.authorize
14
+ end.to change { Doorkeeper::AccessToken.count }.by(1)
15
+ end
16
+ end
17
+
18
+ describe 'with an invalid request' do
19
+ it 'does not issue an access token' do
20
+ request = ClientCredentialsRequest.new(server, nil, {})
21
+ expect do
22
+ request.authorize
23
+ end.to_not change { Doorkeeper::AccessToken.count }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+ require 'active_support/all'
3
+ require 'active_model'
4
+ require 'doorkeeper/oauth/client_credentials_request'
5
+
6
+ module Doorkeeper::OAuth
7
+ describe ClientCredentialsRequest do
8
+ let(:server) { stub :default_scopes => nil }
9
+ let(:client) { stub }
10
+ let(:token_creator) { mock :issuer, :create => true, :token => stub }
11
+
12
+ subject { ClientCredentialsRequest.new(server, client) }
13
+
14
+ before do
15
+ subject.issuer = token_creator
16
+ end
17
+
18
+ it 'issues an access token for the current client' do
19
+ token_creator.should_receive(:create).with(client, nil)
20
+ subject.authorize
21
+ end
22
+
23
+ it 'has successful response when issue was created' do
24
+ subject.authorize
25
+ subject.response.should be_a(TokenResponse)
26
+ end
27
+
28
+ context 'if issue was not created' do
29
+ before do
30
+ subject.issuer = stub :create => false, :error => :invalid
31
+ end
32
+
33
+ it 'has an error response' do
34
+ subject.authorize
35
+ subject.response.should be_a(Doorkeeper::OAuth::ErrorResponse)
36
+ end
37
+
38
+ it 'delegates the error to issuer' do
39
+ subject.authorize
40
+ subject.error.should == :invalid
41
+ end
42
+ end
43
+
44
+ context 'with scopes' do
45
+ let(:default_scopes) { Doorkeeper::OAuth::Scopes.from_string("public email") }
46
+
47
+ before do
48
+ server.stub(:default_scopes).and_return(default_scopes)
49
+ end
50
+
51
+ it 'issues an access token with default scopes if none was requested' do
52
+ token_creator.should_receive(:create).with(client, default_scopes)
53
+ subject.authorize
54
+ end
55
+
56
+ it 'issues an access token with requested scopes' do
57
+ subject = ClientCredentialsRequest.new(server, client, :scope => "email")
58
+ subject.issuer = token_creator
59
+ token_creator.should_receive(:create).with(client, Doorkeeper::OAuth::Scopes.from_string("email"))
60
+ subject.authorize
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+ require 'active_support/core_ext/module/delegation'
3
+ require 'active_support/core_ext/string'
4
+ require 'doorkeeper/oauth/client'
5
+
6
+ module Doorkeeper::OAuth
7
+ describe Client do
8
+ describe :find do
9
+ let(:method) { mock }
10
+
11
+ it 'finds the client via uid' do
12
+ client = stub
13
+ method.should_receive(:call).with('uid').and_return(client)
14
+ Client.find('uid', method).should be_a(Client)
15
+ end
16
+
17
+ it 'returns nil if client was not found' do
18
+ method.should_receive(:call).with('uid').and_return(nil)
19
+ Client.find('uid', method).should be_nil
20
+ end
21
+ end
22
+
23
+ describe :authenticate do
24
+ it 'returns the authenticated client via credentials' do
25
+ credentials = Client::Credentials.new("some-uid", "some-secret")
26
+ authenticator = mock
27
+ authenticator.should_receive(:call).with("some-uid", "some-secret").and_return(stub)
28
+ Client.authenticate(credentials, authenticator).should be_a(Client)
29
+ end
30
+
31
+ it 'retunrs nil if client was not authenticated' do
32
+ credentials = Client::Credentials.new("some-uid", "some-secret")
33
+ authenticator = mock
34
+ authenticator.should_receive(:call).with("some-uid", "some-secret").and_return(nil)
35
+ Client.authenticate(credentials, authenticator).should be_nil
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper_integration'
2
+
3
+ module Doorkeeper::OAuth
4
+ describe CodeRequest do
5
+ let(:pre_auth) do
6
+ mock(:pre_auth, {
7
+ :client => mock(:application, :id => 9990),
8
+ :redirect_uri => 'http://tst.com/cb',
9
+ :scopes => nil,
10
+ :state => nil,
11
+ :error => nil,
12
+ :authorizable? => true
13
+ })
14
+ end
15
+
16
+ let(:owner) { mock :owner, :id => 8900 }
17
+
18
+ subject do
19
+ CodeRequest.new(pre_auth, owner)
20
+ end
21
+
22
+ it 'creates an access grant' do
23
+ expect do
24
+ subject.authorize
25
+ end.to change { Doorkeeper::AccessGrant.count }.by(1)
26
+ end
27
+
28
+ it 'returns a code response' do
29
+ subject.authorize.should be_a(CodeResponse)
30
+ end
31
+
32
+ it 'does not create grant when not authorizable' do
33
+ pre_auth.stub :authorizable? => false
34
+ expect do
35
+ subject.authorize
36
+ end.to_not change { Doorkeeper::AccessGrant.count }
37
+ end
38
+
39
+ it 'returns a error response' do
40
+ pre_auth.stub :authorizable? => false
41
+ subject.authorize.should be_a(ErrorResponse)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ require 'active_model'
3
+ require 'doorkeeper/oauth/error'
4
+ require 'doorkeeper/oauth/error_response'
5
+
6
+ module Doorkeeper::OAuth
7
+ describe ErrorResponse do
8
+ its(:status) { should == :unauthorized }
9
+
10
+ describe :from_request do
11
+ it 'has the error from request' do
12
+ error = ErrorResponse.from_request stub(:error => :some_error)
13
+ error.name.should == :some_error
14
+ end
15
+
16
+ it 'ignores state if request does not respond to state' do
17
+ error = ErrorResponse.from_request stub(:error => :some_error)
18
+ error.state.should be_nil
19
+ end
20
+
21
+ it 'has state if request responds to state' do
22
+ error = ErrorResponse.from_request stub(:error => :some_error, :state => :hello)
23
+ error.state.should == :hello
24
+ end
25
+ end
26
+
27
+ it 'ignores empty error values' do
28
+ subject = ErrorResponse.new(:error => :some_error, :state => nil)
29
+ subject.body.should_not have_key(:state)
30
+ end
31
+
32
+ describe '.body' do
33
+ subject { ErrorResponse.new(:name => :some_error, :state => :some_state) }
34
+
35
+ its(:body) { should have_key(:error) }
36
+ its(:body) { should have_key(:error_description) }
37
+ its(:body) { should have_key(:state) }
38
+ end
39
+ end
40
+ end