doorkeeper-sequel 1.2.1
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.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.gitmodules +3 -0
- data/.rspec +1 -0
- data/.rubocop.yml +13 -0
- data/.travis.yml +24 -0
- data/CHANGELOG.md +24 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +172 -0
- data/LICENSE +21 -0
- data/README.md +76 -0
- data/Rakefile +56 -0
- data/config/locales/en.yml +16 -0
- data/doorkeeper-sequel.gemspec +32 -0
- data/gemfiles/rails-4.2.gemfile +11 -0
- data/gemfiles/rails-5.0.gemfile +11 -0
- data/lib/doorkeeper/orm/sequel/access_grant.rb +9 -0
- data/lib/doorkeeper/orm/sequel/access_token.rb +32 -0
- data/lib/doorkeeper/orm/sequel/application.rb +18 -0
- data/lib/doorkeeper/orm/sequel/models/access_grant_mixin.rb +50 -0
- data/lib/doorkeeper/orm/sequel/models/access_token_mixin.rb +163 -0
- data/lib/doorkeeper/orm/sequel/models/application_mixin.rb +70 -0
- data/lib/doorkeeper/orm/sequel/models/concerns/ownership.rb +19 -0
- data/lib/doorkeeper/orm/sequel/models/concerns/sequel_compat.rb +40 -0
- data/lib/doorkeeper/orm/sequel/validators/redirect_uri_validator.rb +49 -0
- data/lib/doorkeeper/orm/sequel.rb +18 -0
- data/lib/doorkeeper-sequel/gem_version.rb +13 -0
- data/lib/doorkeeper-sequel/version.rb +7 -0
- data/lib/doorkeeper-sequel.rb +18 -0
- data/lib/generators/doorkeeper/sequel/application_owner_generator.rb +23 -0
- data/lib/generators/doorkeeper/sequel/migration_generator.rb +23 -0
- data/lib/generators/doorkeeper/sequel/previous_refresh_token_generator.rb +23 -0
- data/lib/generators/doorkeeper/sequel/templates/add_owner_to_application.rb +9 -0
- data/lib/generators/doorkeeper/sequel/templates/add_previous_refresh_token_to_access_tokens.rb +7 -0
- data/lib/generators/doorkeeper/sequel/templates/migration.rb +59 -0
- data/spec/controllers/application_metal_controller.rb +10 -0
- data/spec/controllers/applications_controller_spec.rb +58 -0
- data/spec/controllers/authorizations_controller_spec.rb +189 -0
- data/spec/controllers/protected_resources_controller_spec.rb +300 -0
- data/spec/controllers/token_info_controller_spec.rb +52 -0
- data/spec/controllers/tokens_controller_spec.rb +88 -0
- data/spec/dummy/Rakefile +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 +11 -0
- data/spec/dummy/app/views/home/index.html.erb +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config/application.rb +29 -0
- data/spec/dummy/config/boot.rb +9 -0
- data/spec/dummy/config/database.yml +15 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +62 -0
- data/spec/dummy/config/environments/test.rb +44 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/db.rb +74 -0
- data/spec/dummy/config/initializers/doorkeeper.rb +96 -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/routes.rb +52 -0
- data/spec/dummy/config.ru +4 -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/20151223192035_create_doorkeeper_tables.rb +60 -0
- data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +7 -0
- data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +11 -0
- data/spec/dummy/db/schema.rb +67 -0
- data/spec/dummy/log/test.log +19813 -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/dummy/tmp/cache/assets/sprockets/v3.0/-T/-TZF6Ae6YipbyKuHghb9wlTx4_b9itbSHRc_2PmqjiU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0p/0pa3wNbGHqFC6gxrMvdOJiP6gPwFv9VJ_npjEfRWxAE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2e/2eYh115US2lIRhM2KTEaJFa6aV_cX8iv6JAdjuq0Uio.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3P/3PoguHEOEeItUjmwC74MWLLP-_Ijow7798bF5U6K2dw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6b/6b0anrSo7Fvoc05t4Ca0zZmfS_cpERy1DsG3ea6lBOg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BA/BAC3ZaGoeZ9Od-kKg-UQYelvRgsCa0H72-52nLdcTNw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bw/Bw6Nimjvy5Yv1AYbZb1t-v0eMNhv-bhwBzR-b5mY7FU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fq/FqQWjMAz8yjZQlMC_dUsztaOxGruI2IXyGAAUF9SvQ0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/J_/J_D9clwKidN28hnVB1O3zEfKDwg90Usdb5ToKiPq_aw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ji/JitNKkP1dYdu9ObSdIkkEAsiFxEmRO5oy1UIyhT_hYs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Jq/JqTLVvnY2AgGkHftWPwqt_HkbwhYRsmgHxk37VqKJAY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QX/QXcp8DweOJ6BfMedGMfeHvVXv2hjDIleln1LSJk7vOE.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qy/Qy1ldbz6vKa_fv4E4ByxWslKFoV1qReQR5DKJ525z88.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rl/RlCJ_X5xFsE3VBDhkYrY7r_R6sMgiAc03cT8nr7Q2vY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ta/TaYxNn81MhqC3DnMC6_y_Q7xap5Ntn4ggFo94EUaiak.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wq/WqbLVKOcTMZtttygYt_ncr1mGIDrzevSTaPGNmzV1D8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YF/YF60qiQ28QMoYDrLmrbHWZr7X7bl5MxVPR5QrrVCFak.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yf/YfJJZvm_NONHd4eCasDibCcRapZ_WYIO5MUxSUUbYFk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Z0/Z0e47cT2a-21U-w-3gkbgqC3o5jWnEzOB8vW06aJH1E.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_u/_uy-z8SVnhffUNelRxbPDL2aAUPb_GbqREXVsfy8uGc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dL/dL7SLUWUIeVdyA1UuH-rvif0nzesOar3LdEtqzdb4bE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/f8/f8WT8jqR1qNIdQaRDpXbyLN7E5AWkbYFBwdh9Ozk7gk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hk/hk2YB6skvc72qL4IzzQKU8Emyfe5vARjoD1bvQTw4zE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iO/iOpDp_7ZvBNO5WIpTmqNewUl9bB2satqXWulyNvAaX8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ii/iiJRBZIsxKiwyzU_Z7UtQeUTXMRJRPTreTKRvAWO7_8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mj/mjuMepngMLrtgilLlJ9oTTSqoGO1YUww1rXphQ1pOm4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qo/qo6SpT75QykYB63Aqq5bgzpXyNU1Y4dGFvCCJgoWQpE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sp/sprzBMBliJDI__s-0D3q82tn1MpBkFV0N651hTr3XE8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tM/tM6A7CR8QluP_u4u59vN1GjSZGNqNH3TXkkNzb9EPXA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vO/vOXN0mER62j4JiPpMTSVS7MMqs0067cZx14vD5B8qiQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zz/zzlQ_kom0liFOvGYDcjtVw6yAHOyA-bbzP8f0e_Tq1A.cache +1 -0
- data/spec/factories.rb +28 -0
- data/spec/generators/application_owner_generator_spec.rb +20 -0
- data/spec/generators/migration_generator_spec.rb +20 -0
- data/spec/generators/previous_refresh_token_generator_spec.rb +20 -0
- data/spec/generators/templates/routes.rb +3 -0
- data/spec/generators/tmp/dummy/db/migrate/20161012132809_create_doorkeeper_tables.rb +59 -0
- data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +24 -0
- data/spec/lib/config_spec.rb +334 -0
- data/spec/lib/doorkeeper_spec.rb +28 -0
- data/spec/lib/models/expirable_spec.rb +51 -0
- data/spec/lib/models/revocable_spec.rb +59 -0
- data/spec/lib/models/scopes_spec.rb +43 -0
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +42 -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 +44 -0
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +86 -0
- data/spec/lib/oauth/client_credentials/validation_spec.rb +54 -0
- data/spec/lib/oauth/client_credentials_integration_spec.rb +27 -0
- data/spec/lib/oauth/client_credentials_request_spec.rb +104 -0
- data/spec/lib/oauth/client_spec.rb +39 -0
- data/spec/lib/oauth/code_request_spec.rb +45 -0
- data/spec/lib/oauth/code_response_spec.rb +34 -0
- data/spec/lib/oauth/error_response_spec.rb +61 -0
- data/spec/lib/oauth/error_spec.rb +23 -0
- data/spec/lib/oauth/forbidden_token_response_spec.rb +23 -0
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +64 -0
- data/spec/lib/oauth/helpers/unique_token_spec.rb +20 -0
- data/spec/lib/oauth/helpers/uri_checker_spec.rb +104 -0
- data/spec/lib/oauth/invalid_token_response_spec.rb +28 -0
- data/spec/lib/oauth/password_access_token_request_spec.rb +90 -0
- data/spec/lib/oauth/pre_authorization_spec.rb +155 -0
- data/spec/lib/oauth/refresh_token_request_spec.rb +154 -0
- data/spec/lib/oauth/scopes_spec.rb +122 -0
- data/spec/lib/oauth/token_request_spec.rb +98 -0
- data/spec/lib/oauth/token_response_spec.rb +85 -0
- data/spec/lib/oauth/token_spec.rb +116 -0
- data/spec/lib/request/strategy_spec.rb +53 -0
- data/spec/lib/server_spec.rb +52 -0
- data/spec/models/doorkeeper/access_grant_spec.rb +36 -0
- data/spec/models/doorkeeper/access_token_spec.rb +394 -0
- data/spec/models/doorkeeper/application_spec.rb +179 -0
- data/spec/requests/applications/applications_request_spec.rb +94 -0
- data/spec/requests/applications/authorized_applications_spec.rb +30 -0
- data/spec/requests/endpoints/authorization_spec.rb +72 -0
- data/spec/requests/endpoints/token_spec.rb +64 -0
- data/spec/requests/flows/authorization_code_errors_spec.rb +66 -0
- data/spec/requests/flows/authorization_code_spec.rb +156 -0
- data/spec/requests/flows/client_credentials_spec.rb +58 -0
- data/spec/requests/flows/implicit_grant_errors_spec.rb +32 -0
- data/spec/requests/flows/implicit_grant_spec.rb +61 -0
- data/spec/requests/flows/password_spec.rb +115 -0
- data/spec/requests/flows/refresh_token_spec.rb +174 -0
- data/spec/requests/flows/revoke_token_spec.rb +157 -0
- data/spec/requests/flows/skip_authorization_spec.rb +59 -0
- data/spec/requests/protected_resources/metal_spec.rb +14 -0
- data/spec/requests/protected_resources/private_api_spec.rb +81 -0
- data/spec/routing/custom_controller_routes_spec.rb +71 -0
- data/spec/routing/default_routes_spec.rb +35 -0
- data/spec/routing/scoped_routes_spec.rb +31 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/spec_helper_integration.rb +50 -0
- data/spec/stubs/config/application.rb +29 -0
- data/spec/stubs/config/initializers/db.rb +74 -0
- data/spec/stubs/generators/application_owner_generator_spec.rb +20 -0
- data/spec/stubs/generators/migration_generator_spec.rb +20 -0
- data/spec/stubs/generators/previous_refresh_token_generator_spec.rb +20 -0
- data/spec/stubs/generators/tmp/dummy/db/migrate/20161012132810_add_owner_to_application.rb +9 -0
- data/spec/stubs/models/user.rb +11 -0
- data/spec/stubs/spec_helper_integration.rb +50 -0
- data/spec/stubs/support/sequel.rb +0 -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 +41 -0
- data/spec/support/helpers/config_helper.rb +9 -0
- data/spec/support/helpers/model_helper.rb +67 -0
- data/spec/support/helpers/request_spec_helper.rb +76 -0
- data/spec/support/helpers/url_helper.rb +55 -0
- data/spec/support/http_method_shim.rb +24 -0
- data/spec/support/orm/active_record.rb +3 -0
- data/spec/support/orm/sequel.rb +0 -0
- data/spec/support/shared/controllers_shared_context.rb +69 -0
- data/spec/support/shared/models_shared_examples.rb +52 -0
- data/spec/validators/redirect_uri_validator_spec.rb +78 -0
- metadata +570 -0
|
@@ -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 = double parameters: { client_id: client_id, client_secret: client_secret }
|
|
19
|
+
uid, secret = subject.from_params(request)
|
|
20
|
+
|
|
21
|
+
expect(uid).to eq('some-uid')
|
|
22
|
+
expect(secret).to eq('some-secret')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'is blank when there are no credentials' do
|
|
26
|
+
request = double parameters: {}
|
|
27
|
+
uid, secret = subject.from_params(request)
|
|
28
|
+
|
|
29
|
+
expect(uid).to be_blank
|
|
30
|
+
expect(secret).to 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 = double authorization: "Basic #{credentials}"
|
|
39
|
+
uid, secret = subject.from_basic(request)
|
|
40
|
+
|
|
41
|
+
expect(uid).to eq('some-uid')
|
|
42
|
+
expect(secret).to eq('some-secret')
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'is blank if Authorization is not Basic' do
|
|
46
|
+
request = double authorization: "#{credentials}"
|
|
47
|
+
uid, secret = subject.from_basic(request)
|
|
48
|
+
|
|
49
|
+
expect(uid).to be_blank
|
|
50
|
+
expect(secret).to be_blank
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
context "when reuse_access_token is true" do
|
|
15
|
+
it "returns the existing valid token" do
|
|
16
|
+
allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
|
|
17
|
+
existing_token = subject.call(client, scopes)
|
|
18
|
+
|
|
19
|
+
result = subject.call(client, scopes)
|
|
20
|
+
|
|
21
|
+
expect(Doorkeeper::AccessToken.count).to eq(1)
|
|
22
|
+
expect(result).to eq(existing_token)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context "when reuse_access_token is false" do
|
|
27
|
+
it "returns a new token" do
|
|
28
|
+
allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(false)
|
|
29
|
+
existing_token = subject.call(client, scopes)
|
|
30
|
+
|
|
31
|
+
result = subject.call(client, scopes)
|
|
32
|
+
|
|
33
|
+
expect(Doorkeeper::AccessToken.count).to eq(2)
|
|
34
|
+
expect(result).not_to eq(existing_token)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'returns false if creation fails' do
|
|
39
|
+
expect(Doorkeeper::AccessToken).to receive(:find_or_create_for).and_return(false)
|
|
40
|
+
created = subject.call(client, scopes)
|
|
41
|
+
expect(created).to be_falsey
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
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) { double :acces_token_creator }
|
|
8
|
+
let(:server) do
|
|
9
|
+
double(
|
|
10
|
+
:server,
|
|
11
|
+
access_token_expires_in: 100,
|
|
12
|
+
custom_access_token_expires_in: ->(_app) { nil }
|
|
13
|
+
)
|
|
14
|
+
end
|
|
15
|
+
let(:validation) { double :validation, valid?: true }
|
|
16
|
+
|
|
17
|
+
subject { Issuer.new(server, validation) }
|
|
18
|
+
|
|
19
|
+
describe :create do
|
|
20
|
+
let(:client) { double :client, id: 'some-id' }
|
|
21
|
+
let(:scopes) { 'some scope' }
|
|
22
|
+
|
|
23
|
+
it 'creates and sets the token' do
|
|
24
|
+
expect(creator).to receive(:call).and_return('token')
|
|
25
|
+
subject.create client, scopes, creator
|
|
26
|
+
|
|
27
|
+
expect(subject.token).to eq('token')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'creates with correct token parameters' do
|
|
31
|
+
expect(creator).to receive(:call).with(
|
|
32
|
+
client,
|
|
33
|
+
scopes,
|
|
34
|
+
expires_in: 100,
|
|
35
|
+
use_refresh_token: false
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
subject.create client, scopes, creator
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'has error set to :server_error if creator fails' do
|
|
42
|
+
expect(creator).to receive(:call).and_return(false)
|
|
43
|
+
subject.create client, scopes, creator
|
|
44
|
+
|
|
45
|
+
expect(subject.error).to eq(:server_error)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'when validation fails' do
|
|
49
|
+
before do
|
|
50
|
+
allow(validation).to receive(:valid?).and_return(false)
|
|
51
|
+
allow(validation).to receive(:error).and_return(:validation_error)
|
|
52
|
+
expect(creator).not_to receive(:create)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'has error set from validation' do
|
|
56
|
+
subject.create client, scopes, creator
|
|
57
|
+
expect(subject.error).to eq(:validation_error)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'returns false' do
|
|
61
|
+
expect(subject.create(client, scopes, creator)).to be_falsey
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context 'with custom expirations' do
|
|
66
|
+
let(:custom_ttl) { 1233 }
|
|
67
|
+
let(:server) do
|
|
68
|
+
double(
|
|
69
|
+
:server,
|
|
70
|
+
custom_access_token_expires_in: ->(_app) { custom_ttl }
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it 'creates with correct token parameters' do
|
|
75
|
+
expect(creator).to receive(:call).with(
|
|
76
|
+
client,
|
|
77
|
+
scopes,
|
|
78
|
+
expires_in: custom_ttl,
|
|
79
|
+
use_refresh_token: false
|
|
80
|
+
)
|
|
81
|
+
subject.create client, scopes, creator
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
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) { double :server, scopes: nil }
|
|
8
|
+
let(:application) { double scopes: nil }
|
|
9
|
+
let(:client) { double application: application }
|
|
10
|
+
let(:request) { double :request, client: client, scopes: nil }
|
|
11
|
+
|
|
12
|
+
subject { Validation.new(server, request) }
|
|
13
|
+
|
|
14
|
+
it 'is valid with valid request' do
|
|
15
|
+
expect(subject).to be_valid
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'is invalid when client is not present' do
|
|
19
|
+
allow(request).to receive(:client).and_return(nil)
|
|
20
|
+
expect(subject).not_to be_valid
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context 'with scopes' do
|
|
24
|
+
it 'is invalid when scopes are not included in the server' do
|
|
25
|
+
server_scopes = Doorkeeper::OAuth::Scopes.from_string 'email'
|
|
26
|
+
allow(server).to receive(:scopes).and_return(server_scopes)
|
|
27
|
+
allow(request).to receive(:scopes).and_return(
|
|
28
|
+
Doorkeeper::OAuth::Scopes.from_string 'invalid')
|
|
29
|
+
expect(subject).not_to be_valid
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'with application scopes' do
|
|
33
|
+
it 'is valid when scopes are included in the application' do
|
|
34
|
+
application_scopes = Doorkeeper::OAuth::Scopes.from_string 'app'
|
|
35
|
+
server_scopes = Doorkeeper::OAuth::Scopes.from_string 'email app'
|
|
36
|
+
allow(application).to receive(:scopes).and_return(application_scopes)
|
|
37
|
+
allow(server).to receive(:scopes).and_return(server_scopes)
|
|
38
|
+
allow(request).to receive(:scopes).and_return(application_scopes)
|
|
39
|
+
expect(subject).to be_valid
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'is invalid when scopes are not included in the application' do
|
|
43
|
+
application_scopes = Doorkeeper::OAuth::Scopes.from_string 'app'
|
|
44
|
+
server_scopes = Doorkeeper::OAuth::Scopes.from_string 'email app'
|
|
45
|
+
allow(application).to receive(:scopes).and_return(application_scopes)
|
|
46
|
+
allow(server).to receive(:scopes).and_return(server_scopes)
|
|
47
|
+
allow(request).to receive(:scopes).and_return(
|
|
48
|
+
Doorkeeper::OAuth::Scopes.from_string 'email')
|
|
49
|
+
expect(subject).not_to be_valid
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
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,104 @@
|
|
|
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) do
|
|
9
|
+
double(
|
|
10
|
+
default_scopes: nil,
|
|
11
|
+
custom_access_token_expires_in: ->(_app) { nil }
|
|
12
|
+
)
|
|
13
|
+
end
|
|
14
|
+
let(:application) { double :application, scopes: Scopes.from_string('') }
|
|
15
|
+
let(:client) { double :client, application: application }
|
|
16
|
+
let(:token_creator) { double :issuer, create: true, token: double }
|
|
17
|
+
|
|
18
|
+
subject { ClientCredentialsRequest.new(server, client) }
|
|
19
|
+
|
|
20
|
+
before do
|
|
21
|
+
subject.issuer = token_creator
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'issues an access token for the current client' do
|
|
25
|
+
expect(token_creator).to receive(:create).with(client, nil)
|
|
26
|
+
subject.authorize
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'has successful response when issue was created' do
|
|
30
|
+
subject.authorize
|
|
31
|
+
expect(subject.response).to be_a(TokenResponse)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context 'if issue was not created' do
|
|
35
|
+
before do
|
|
36
|
+
subject.issuer = double create: false, error: :invalid
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'has an error response' do
|
|
40
|
+
subject.authorize
|
|
41
|
+
expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'delegates the error to issuer' do
|
|
45
|
+
subject.authorize
|
|
46
|
+
expect(subject.error).to eq(:invalid)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context 'with scopes' do
|
|
51
|
+
let(:default_scopes) { Doorkeeper::OAuth::Scopes.from_string('public email') }
|
|
52
|
+
|
|
53
|
+
before do
|
|
54
|
+
allow(server).to receive(:default_scopes).and_return(default_scopes)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'issues an access token with default scopes if none was requested' do
|
|
58
|
+
expect(token_creator).to receive(:create).with(client, default_scopes)
|
|
59
|
+
subject.authorize
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it 'issues an access token with requested scopes' do
|
|
63
|
+
subject = ClientCredentialsRequest.new(server, client, scope: 'email')
|
|
64
|
+
subject.issuer = token_creator
|
|
65
|
+
expect(token_creator).to receive(:create).with(client, Doorkeeper::OAuth::Scopes.from_string('email'))
|
|
66
|
+
subject.authorize
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context 'with restricted client' do
|
|
71
|
+
let(:default_scopes) do
|
|
72
|
+
Doorkeeper::OAuth::Scopes.from_string('public email')
|
|
73
|
+
end
|
|
74
|
+
let(:server_scopes) do
|
|
75
|
+
Doorkeeper::OAuth::Scopes.from_string('public email phone')
|
|
76
|
+
end
|
|
77
|
+
let(:client_scopes) do
|
|
78
|
+
Doorkeeper::OAuth::Scopes.from_string('public phone')
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
before do
|
|
82
|
+
allow(server).to receive(:default_scopes).and_return(default_scopes)
|
|
83
|
+
allow(server).to receive(:scopes).and_return(server_scopes)
|
|
84
|
+
allow(server).to receive(:access_token_expires_in).and_return(100)
|
|
85
|
+
allow(application).to receive(:scopes).and_return(client_scopes)
|
|
86
|
+
allow(client).to receive(:id).and_return(nil)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it 'delegates the error to issuer if no scope was requested' do
|
|
90
|
+
subject = ClientCredentialsRequest.new(server, client)
|
|
91
|
+
subject.authorize
|
|
92
|
+
expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
|
|
93
|
+
expect(subject.error).to eq(:invalid_scope)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it 'issues an access token with requested scopes' do
|
|
97
|
+
subject = ClientCredentialsRequest.new(server, client, scope: 'phone')
|
|
98
|
+
subject.authorize
|
|
99
|
+
expect(subject.response).to be_a(Doorkeeper::OAuth::TokenResponse)
|
|
100
|
+
expect(subject.response.token.scopes_string).to eq('phone')
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
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) { double }
|
|
10
|
+
|
|
11
|
+
it 'finds the client via uid' do
|
|
12
|
+
client = double
|
|
13
|
+
expect(method).to receive(:call).with('uid').and_return(client)
|
|
14
|
+
expect(Client.find('uid', method)).to be_a(Client)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it 'returns nil if client was not found' do
|
|
18
|
+
expect(method).to receive(:call).with('uid').and_return(nil)
|
|
19
|
+
expect(Client.find('uid', method)).to 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 = double
|
|
27
|
+
expect(authenticator).to receive(:call).with('some-uid', 'some-secret').and_return(double)
|
|
28
|
+
expect(Client.authenticate(credentials, authenticator)).to be_a(Client)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'returns nil if client was not authenticated' do
|
|
32
|
+
credentials = Client::Credentials.new('some-uid', 'some-secret')
|
|
33
|
+
authenticator = double
|
|
34
|
+
expect(authenticator).to receive(:call).with('some-uid', 'some-secret').and_return(nil)
|
|
35
|
+
expect(Client.authenticate(credentials, authenticator)).to be_nil
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'spec_helper_integration'
|
|
2
|
+
|
|
3
|
+
module Doorkeeper::OAuth
|
|
4
|
+
describe CodeRequest do
|
|
5
|
+
let(:pre_auth) do
|
|
6
|
+
double(
|
|
7
|
+
:pre_auth,
|
|
8
|
+
client: double(:application, id: 9990),
|
|
9
|
+
redirect_uri: 'http://tst.com/cb',
|
|
10
|
+
scopes: nil,
|
|
11
|
+
state: nil,
|
|
12
|
+
error: nil,
|
|
13
|
+
authorizable?: true
|
|
14
|
+
)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
let(:owner) { double :owner, id: 8900 }
|
|
18
|
+
|
|
19
|
+
subject do
|
|
20
|
+
CodeRequest.new(pre_auth, owner)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'creates an access grant' do
|
|
24
|
+
expect do
|
|
25
|
+
subject.authorize
|
|
26
|
+
end.to change { Doorkeeper::AccessGrant.count }.by(1)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'returns a code response' do
|
|
30
|
+
expect(subject.authorize).to be_a(CodeResponse)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'does not create grant when not authorizable' do
|
|
34
|
+
allow(pre_auth).to receive(:authorizable?).and_return(false)
|
|
35
|
+
expect do
|
|
36
|
+
subject.authorize
|
|
37
|
+
end.to_not change { Doorkeeper::AccessGrant.count }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it 'returns a error response' do
|
|
41
|
+
allow(pre_auth).to receive(:authorizable?).and_return(false)
|
|
42
|
+
expect(subject.authorize).to be_a(ErrorResponse)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Doorkeeper
|
|
4
|
+
module OAuth
|
|
5
|
+
describe CodeResponse do
|
|
6
|
+
describe '.redirect_uri' do
|
|
7
|
+
context 'when generating the redirect URI for an implicit grant' do
|
|
8
|
+
let :pre_auth do
|
|
9
|
+
double(
|
|
10
|
+
:pre_auth,
|
|
11
|
+
client: double(:application, id: 1),
|
|
12
|
+
redirect_uri: 'http://tst.com/cb',
|
|
13
|
+
state: nil,
|
|
14
|
+
scopes: Scopes.from_string('public'),
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
let :auth do
|
|
19
|
+
Authorization::Token.new(pre_auth, double(id: 1)).tap do |c|
|
|
20
|
+
c.issue_token
|
|
21
|
+
allow(c.token).to receive(:expires_in_seconds).and_return(3600)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
subject { CodeResponse.new(pre_auth, auth, response_on_fragment: true).redirect_uri }
|
|
26
|
+
|
|
27
|
+
it 'includes the remaining TTL of the token relative to the time the token was generated' do
|
|
28
|
+
expect(subject).to include('expires_in=3600')
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
describe '#status' do
|
|
9
|
+
it 'should have a status of unauthorized' do
|
|
10
|
+
expect(subject.status).to eq(:unauthorized)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe :from_request do
|
|
15
|
+
it 'has the error from request' do
|
|
16
|
+
error = ErrorResponse.from_request double(error: :some_error)
|
|
17
|
+
expect(error.name).to eq(:some_error)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'ignores state if request does not respond to state' do
|
|
21
|
+
error = ErrorResponse.from_request double(error: :some_error)
|
|
22
|
+
expect(error.state).to be_nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'has state if request responds to state' do
|
|
26
|
+
error = ErrorResponse.from_request double(error: :some_error, state: :hello)
|
|
27
|
+
expect(error.state).to eq(:hello)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'ignores empty error values' do
|
|
32
|
+
subject = ErrorResponse.new(error: :some_error, state: nil)
|
|
33
|
+
expect(subject.body).not_to have_key(:state)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe '.body' do
|
|
37
|
+
subject { ErrorResponse.new(name: :some_error, state: :some_state).body }
|
|
38
|
+
|
|
39
|
+
describe '#body' do
|
|
40
|
+
it { expect(subject).to have_key(:error) }
|
|
41
|
+
it { expect(subject).to have_key(:error_description) }
|
|
42
|
+
it { expect(subject).to have_key(:state) }
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe '.authenticate_info' do
|
|
47
|
+
let(:error_response) { ErrorResponse.new(name: :some_error, state: :some_state) }
|
|
48
|
+
subject { error_response.authenticate_info }
|
|
49
|
+
|
|
50
|
+
it { expect(subject).to include("realm=\"#{error_response.realm}\"") }
|
|
51
|
+
it { expect(subject).to include("error=\"#{error_response.name}\"") }
|
|
52
|
+
it { expect(subject).to include("error_description=\"#{error_response.description}\"") }
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe '.headers' do
|
|
56
|
+
subject { ErrorResponse.new(name: :some_error, state: :some_state).headers }
|
|
57
|
+
|
|
58
|
+
it { expect(subject).to include 'WWW-Authenticate' }
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'active_support/i18n'
|
|
3
|
+
require 'doorkeeper/oauth/error'
|
|
4
|
+
|
|
5
|
+
module Doorkeeper::OAuth
|
|
6
|
+
describe Error do
|
|
7
|
+
subject(:error) { Error.new(:some_error, :some_state) }
|
|
8
|
+
|
|
9
|
+
it { expect(subject).to respond_to(:name) }
|
|
10
|
+
it { expect(subject).to respond_to(:state) }
|
|
11
|
+
|
|
12
|
+
describe :description do
|
|
13
|
+
it 'is translated from translation messages' do
|
|
14
|
+
expect(I18n).to receive(:translate).with(
|
|
15
|
+
:some_error,
|
|
16
|
+
scope: [:doorkeeper, :errors, :messages],
|
|
17
|
+
default: :server_error
|
|
18
|
+
)
|
|
19
|
+
error.description
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'active_model'
|
|
3
|
+
require 'doorkeeper'
|
|
4
|
+
require 'doorkeeper/oauth/forbidden_token_response'
|
|
5
|
+
|
|
6
|
+
module Doorkeeper::OAuth
|
|
7
|
+
describe ForbiddenTokenResponse do
|
|
8
|
+
describe '#name' do
|
|
9
|
+
it { expect(subject.name).to eq(:invalid_scope) }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe '#status' do
|
|
13
|
+
it { expect(subject.status).to eq(:forbidden) }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe :from_scopes do
|
|
17
|
+
it 'should have a list of acceptable scopes' do
|
|
18
|
+
response = ForbiddenTokenResponse.from_scopes(["public"])
|
|
19
|
+
expect(response.description).to include('public')
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'active_support/core_ext/string'
|
|
3
|
+
require 'doorkeeper/oauth/helpers/scope_checker'
|
|
4
|
+
require 'doorkeeper/oauth/scopes'
|
|
5
|
+
|
|
6
|
+
module Doorkeeper::OAuth::Helpers
|
|
7
|
+
describe ScopeChecker, '.valid?' do
|
|
8
|
+
let(:server_scopes) { Doorkeeper::OAuth::Scopes.new }
|
|
9
|
+
|
|
10
|
+
it 'is valid if scope is present' do
|
|
11
|
+
server_scopes.add :scope
|
|
12
|
+
expect(ScopeChecker.valid?('scope', server_scopes)).to be_truthy
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'is invalid if includes tabs space' do
|
|
16
|
+
expect(ScopeChecker.valid?("\tsomething", server_scopes)).to be_falsey
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'is invalid if scope is not present' do
|
|
20
|
+
expect(ScopeChecker.valid?(nil, server_scopes)).to be_falsey
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'is invalid if scope is blank' do
|
|
24
|
+
expect(ScopeChecker.valid?(' ', server_scopes)).to be_falsey
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it 'is invalid if includes return space' do
|
|
28
|
+
expect(ScopeChecker.valid?("scope\r", server_scopes)).to be_falsey
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'is invalid if includes new lines' do
|
|
32
|
+
expect(ScopeChecker.valid?("scope\nanother", server_scopes)).to be_falsey
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'is invalid if any scope is not included in server scopes' do
|
|
36
|
+
expect(ScopeChecker.valid?('scope another', server_scopes)).to be_falsey
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context 'with application_scopes' do
|
|
40
|
+
let(:server_scopes) do
|
|
41
|
+
Doorkeeper::OAuth::Scopes.from_string 'common svr'
|
|
42
|
+
end
|
|
43
|
+
let(:application_scopes) do
|
|
44
|
+
Doorkeeper::OAuth::Scopes.from_string 'app123'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'is valid if scope is included in the application scope list' do
|
|
48
|
+
expect(ScopeChecker.valid?(
|
|
49
|
+
'app123',
|
|
50
|
+
server_scopes,
|
|
51
|
+
application_scopes
|
|
52
|
+
)).to be_truthy
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'is invalid if any scope is not included in the application' do
|
|
56
|
+
expect(ScopeChecker.valid?(
|
|
57
|
+
'svr',
|
|
58
|
+
server_scopes,
|
|
59
|
+
application_scopes
|
|
60
|
+
)).to be_falsey
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'doorkeeper/oauth/helpers/unique_token'
|
|
3
|
+
|
|
4
|
+
module Doorkeeper::OAuth::Helpers
|
|
5
|
+
describe UniqueToken do
|
|
6
|
+
let :generator do
|
|
7
|
+
->(size) { 'a' * size }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it 'is able to customize the generator method' do
|
|
11
|
+
token = UniqueToken.generate(generator: generator)
|
|
12
|
+
expect(token).to eq('a' * 32)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'is able to customize the size of the token' do
|
|
16
|
+
token = UniqueToken.generate(generator: generator, size: 2)
|
|
17
|
+
expect(token).to eq('aa')
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|