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.
- data/.gitignore +14 -0
- data/.rspec +1 -0
- data/.travis.yml +28 -0
- data/CHANGELOG.md +198 -0
- data/Gemfile +32 -0
- data/MIT-LICENSE +20 -0
- data/README.md +290 -0
- data/Rakefile +18 -0
- data/app/assets/javascripts/doorkeeper/application.js +2 -0
- data/app/assets/stylesheets/doorkeeper/application.css +18 -0
- data/app/assets/stylesheets/doorkeeper/form.css +13 -0
- data/app/controllers/doorkeeper/application_controller.rb +7 -0
- data/app/controllers/doorkeeper/applications_controller.rb +60 -0
- data/app/controllers/doorkeeper/authorizations_controller.rb +57 -0
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +12 -0
- data/app/controllers/doorkeeper/token_info_controller.rb +12 -0
- data/app/controllers/doorkeeper/tokens_controller.rb +20 -0
- data/app/helpers/doorkeeper/form_errors_helper.rb +9 -0
- data/app/validators/redirect_uri_validator.rb +23 -0
- data/app/views/doorkeeper/applications/_form.html.erb +34 -0
- data/app/views/doorkeeper/applications/edit.html.erb +13 -0
- data/app/views/doorkeeper/applications/index.html.erb +29 -0
- data/app/views/doorkeeper/applications/new.html.erb +13 -0
- data/app/views/doorkeeper/applications/show.html.erb +26 -0
- data/app/views/doorkeeper/authorizations/error.html.erb +6 -0
- data/app/views/doorkeeper/authorizations/new.html.erb +37 -0
- data/app/views/doorkeeper/authorizations/show.html.erb +4 -0
- data/app/views/doorkeeper/authorized_applications/index.html.erb +25 -0
- data/app/views/layouts/doorkeeper/application.html.erb +33 -0
- data/config/locales/en.yml +68 -0
- data/doorkeeper.gemspec +28 -0
- data/lib/doorkeeper.rb +64 -0
- data/lib/doorkeeper/config.rb +194 -0
- data/lib/doorkeeper/doorkeeper_for.rb +76 -0
- data/lib/doorkeeper/engine.rb +19 -0
- data/lib/doorkeeper/errors.rb +15 -0
- data/lib/doorkeeper/helpers/controller.rb +58 -0
- data/lib/doorkeeper/helpers/filter.rb +38 -0
- data/lib/doorkeeper/models/access_grant.rb +24 -0
- data/lib/doorkeeper/models/access_token.rb +95 -0
- data/lib/doorkeeper/models/accessible.rb +9 -0
- data/lib/doorkeeper/models/active_record/access_grant.rb +5 -0
- data/lib/doorkeeper/models/active_record/access_token.rb +21 -0
- data/lib/doorkeeper/models/active_record/application.rb +20 -0
- data/lib/doorkeeper/models/application.rb +33 -0
- data/lib/doorkeeper/models/couchbase/access_grant.rb +10 -0
- data/lib/doorkeeper/models/couchbase/access_token.rb +7 -0
- data/lib/doorkeeper/models/couchbase/application.rb +35 -0
- data/lib/doorkeeper/models/doorkeeper_access_grant/by_token/map.js +5 -0
- data/lib/doorkeeper/models/doorkeeper_access_token/by_application_id/map.js +5 -0
- data/lib/doorkeeper/models/doorkeeper_access_token/by_application_id_and_resource_owner_id/map.js +5 -0
- data/lib/doorkeeper/models/doorkeeper_access_token/by_refresh_token/map.js +5 -0
- data/lib/doorkeeper/models/doorkeeper_access_token/by_resource_owner_id/map.js +5 -0
- data/lib/doorkeeper/models/doorkeeper_access_token/by_token/map.js +5 -0
- data/lib/doorkeeper/models/doorkeeper_application/by_uid/map.js +5 -0
- data/lib/doorkeeper/models/doorkeeper_application/by_uid_and_secret/map.js +5 -0
- data/lib/doorkeeper/models/doorkeeper_application/show_all/map.js +6 -0
- data/lib/doorkeeper/models/expirable.rb +21 -0
- data/lib/doorkeeper/models/mongo_mapper/access_grant.rb +28 -0
- data/lib/doorkeeper/models/mongo_mapper/access_token.rb +51 -0
- data/lib/doorkeeper/models/mongo_mapper/application.rb +30 -0
- data/lib/doorkeeper/models/mongo_mapper/revocable.rb +15 -0
- data/lib/doorkeeper/models/mongoid/revocable.rb +15 -0
- data/lib/doorkeeper/models/mongoid/scopes.rb +15 -0
- data/lib/doorkeeper/models/mongoid2/access_grant.rb +22 -0
- data/lib/doorkeeper/models/mongoid2/access_token.rb +41 -0
- data/lib/doorkeeper/models/mongoid2/application.rb +22 -0
- data/lib/doorkeeper/models/mongoid3/access_grant.rb +22 -0
- data/lib/doorkeeper/models/mongoid3/access_token.rb +41 -0
- data/lib/doorkeeper/models/mongoid3/application.rb +22 -0
- data/lib/doorkeeper/models/ownership.rb +16 -0
- data/lib/doorkeeper/models/scopes.rb +17 -0
- data/lib/doorkeeper/oauth/authorization.rb +10 -0
- data/lib/doorkeeper/oauth/authorization/code.rb +32 -0
- data/lib/doorkeeper/oauth/authorization/token.rb +28 -0
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +29 -0
- data/lib/doorkeeper/oauth/authorization_code_request.rb +82 -0
- data/lib/doorkeeper/oauth/client.rb +29 -0
- data/lib/doorkeeper/oauth/client/credentials.rb +21 -0
- data/lib/doorkeeper/oauth/client/methods.rb +18 -0
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +29 -0
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +35 -0
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +33 -0
- data/lib/doorkeeper/oauth/client_credentials_request.rb +47 -0
- data/lib/doorkeeper/oauth/code_request.rb +28 -0
- data/lib/doorkeeper/oauth/code_response.rb +37 -0
- data/lib/doorkeeper/oauth/error.rb +9 -0
- data/lib/doorkeeper/oauth/error_response.rb +44 -0
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +18 -0
- data/lib/doorkeeper/oauth/helpers/unique_token.rb +13 -0
- data/lib/doorkeeper/oauth/helpers/uri_checker.rb +32 -0
- data/lib/doorkeeper/oauth/password_access_token_request.rb +84 -0
- data/lib/doorkeeper/oauth/pre_authorization.rb +62 -0
- data/lib/doorkeeper/oauth/refresh_token_request.rb +58 -0
- data/lib/doorkeeper/oauth/scopes.rb +60 -0
- data/lib/doorkeeper/oauth/token.rb +36 -0
- data/lib/doorkeeper/oauth/token_request.rb +28 -0
- data/lib/doorkeeper/oauth/token_response.rb +29 -0
- data/lib/doorkeeper/rails/routes.rb +90 -0
- data/lib/doorkeeper/rails/routes/mapper.rb +28 -0
- data/lib/doorkeeper/rails/routes/mapping.rb +39 -0
- data/lib/doorkeeper/request.rb +33 -0
- data/lib/doorkeeper/request/authorization_code.rb +23 -0
- data/lib/doorkeeper/request/client_credentials.rb +23 -0
- data/lib/doorkeeper/request/code.rb +24 -0
- data/lib/doorkeeper/request/password.rb +23 -0
- data/lib/doorkeeper/request/refresh_token.rb +23 -0
- data/lib/doorkeeper/request/token.rb +24 -0
- data/lib/doorkeeper/server.rb +54 -0
- data/lib/doorkeeper/validations.rb +30 -0
- data/lib/doorkeeper/version.rb +3 -0
- data/lib/generators/doorkeeper/application_owner_generator.rb +15 -0
- data/lib/generators/doorkeeper/install_generator.rb +12 -0
- data/lib/generators/doorkeeper/migration_generator.rb +15 -0
- data/lib/generators/doorkeeper/mongo_mapper/indexes_generator.rb +12 -0
- data/lib/generators/doorkeeper/templates/README +44 -0
- data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +7 -0
- data/lib/generators/doorkeeper/templates/indexes.rb +3 -0
- data/lib/generators/doorkeeper/templates/initializer.rb +67 -0
- data/lib/generators/doorkeeper/templates/migration.rb +42 -0
- data/lib/generators/doorkeeper/views_generator.rb +15 -0
- data/script/rails +6 -0
- data/script/run_all +14 -0
- data/spec/controllers/applications_controller_spec.rb +18 -0
- data/spec/controllers/authorizations_controller_spec.rb +154 -0
- data/spec/controllers/protected_resources_controller_spec.rb +304 -0
- data/spec/controllers/token_info_controller_spec.rb +54 -0
- data/spec/controllers/tokens_controller_spec.rb +36 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/custom_authorizations_controller.rb +7 -0
- data/spec/dummy/app/controllers/full_protected_resources_controller.rb +12 -0
- data/spec/dummy/app/controllers/home_controller.rb +17 -0
- data/spec/dummy/app/controllers/metal_controller.rb +11 -0
- data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +11 -0
- data/spec/dummy/app/helpers/application_helper.rb +5 -0
- data/spec/dummy/app/models/user.rb +27 -0
- data/spec/dummy/app/views/home/index.html.erb +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +16 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +54 -0
- data/spec/dummy/config/boot.rb +6 -0
- data/spec/dummy/config/database.yml +15 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +30 -0
- data/spec/dummy/config/environments/production.rb +60 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/doorkeeper.rb +56 -0
- data/spec/dummy/config/initializers/secret_token.rb +9 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/doorkeeper.en.yml +5 -0
- data/spec/dummy/config/mongo.yml +11 -0
- data/spec/dummy/config/mongoid2.yml +9 -0
- data/spec/dummy/config/mongoid3.yml +18 -0
- data/spec/dummy/config/routes.rb +38 -0
- data/spec/dummy/db/migrate/20111122132257_create_users.rb +9 -0
- data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +5 -0
- data/spec/dummy/db/migrate/20120524202412_create_doorkeeper_tables.rb +44 -0
- data/spec/dummy/db/schema.rb +64 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/factories/access_grant.rb +9 -0
- data/spec/factories/access_token.rb +7 -0
- data/spec/factories/application.rb +6 -0
- data/spec/generators/application_owner_generator_spec.rb +23 -0
- data/spec/generators/install_generator_spec.rb +31 -0
- data/spec/generators/migration_generator_spec.rb +20 -0
- data/spec/generators/templates/routes.rb +3 -0
- data/spec/generators/views_generator_spec.rb +27 -0
- data/spec/lib/config_spec.rb +170 -0
- data/spec/lib/models/expirable_spec.rb +51 -0
- data/spec/lib/models/revocable_spec.rb +31 -0
- data/spec/lib/models/scopes_spec.rb +32 -0
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +37 -0
- data/spec/lib/oauth/authorization_code_request_spec.rb +80 -0
- data/spec/lib/oauth/client/credentials_spec.rb +47 -0
- data/spec/lib/oauth/client/methods_spec.rb +54 -0
- data/spec/lib/oauth/client_credentials/creator_spec.rb +47 -0
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +57 -0
- data/spec/lib/oauth/client_credentials/validation_spec.rb +29 -0
- data/spec/lib/oauth/client_credentials_integration_spec.rb +27 -0
- data/spec/lib/oauth/client_credentials_request_spec.rb +64 -0
- data/spec/lib/oauth/client_spec.rb +39 -0
- data/spec/lib/oauth/code_request_spec.rb +44 -0
- data/spec/lib/oauth/error_response_spec.rb +40 -0
- data/spec/lib/oauth/error_spec.rb +19 -0
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +74 -0
- data/spec/lib/oauth/helpers/unique_token_spec.rb +20 -0
- data/spec/lib/oauth/helpers/uri_checker_spec.rb +64 -0
- data/spec/lib/oauth/password_access_token_request_spec.rb +65 -0
- data/spec/lib/oauth/pre_authorization_spec.rb +80 -0
- data/spec/lib/oauth/refresh_token_request_spec.rb +56 -0
- data/spec/lib/oauth/scopes_spec.rb +115 -0
- data/spec/lib/oauth/token_request_spec.rb +46 -0
- data/spec/lib/oauth/token_response_spec.rb +52 -0
- data/spec/lib/oauth/token_spec.rb +83 -0
- data/spec/lib/server_spec.rb +24 -0
- data/spec/models/doorkeeper/access_grant_spec.rb +36 -0
- data/spec/models/doorkeeper/access_token_spec.rb +153 -0
- data/spec/models/doorkeeper/application_spec.rb +162 -0
- data/spec/requests/applications/applications_request_spec.rb +92 -0
- data/spec/requests/applications/authorized_applications_spec.rb +30 -0
- data/spec/requests/endpoints/authorization_spec.rb +47 -0
- data/spec/requests/endpoints/token_spec.rb +46 -0
- data/spec/requests/flows/authorization_code_errors_spec.rb +66 -0
- data/spec/requests/flows/authorization_code_spec.rb +135 -0
- data/spec/requests/flows/client_credentials_spec.rb +58 -0
- data/spec/requests/flows/implicit_grant_errors_spec.rb +31 -0
- data/spec/requests/flows/implicit_grant_spec.rb +19 -0
- data/spec/requests/flows/password_spec.rb +78 -0
- data/spec/requests/flows/refresh_token_spec.rb +71 -0
- data/spec/requests/flows/skip_authorization_spec.rb +40 -0
- data/spec/requests/protected_resources/metal_spec.rb +14 -0
- data/spec/requests/protected_resources/private_api_spec.rb +50 -0
- data/spec/routing/custom_controller_routes_spec.rb +44 -0
- data/spec/routing/default_routes_spec.rb +32 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/spec_helper_integration.rb +40 -0
- data/spec/support/dependencies/factory_girl.rb +2 -0
- data/spec/support/helpers/access_token_request_helper.rb +11 -0
- data/spec/support/helpers/authorization_request_helper.rb +32 -0
- data/spec/support/helpers/config_helper.rb +9 -0
- data/spec/support/helpers/model_helper.rb +45 -0
- data/spec/support/helpers/request_spec_helper.rb +72 -0
- data/spec/support/helpers/url_helper.rb +51 -0
- data/spec/support/orm/active_record.rb +11 -0
- data/spec/support/orm/mongo_mapper.rb +26 -0
- data/spec/support/orm/mongoid.rb +31 -0
- data/spec/support/shared/controllers_shared_context.rb +60 -0
- data/spec/support/shared/models_shared_examples.rb +60 -0
- data/spec/validators/redirect_uri_validator_spec.rb +47 -0
- data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +356 -0
- 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
|